Проблема компіляції Maven 3 та JUnit 4: пакет org.junit не існує


80

Я намагаюся створити простий проект Java за допомогою Maven. У своєму pom-файлі я оголошую JUnit 4.8.2 єдиною залежністю. Все ще Maven наполягає на використанні JUnit версії 3.8.1. Як це виправити?

Проблема виявляється в помилці компіляції: "пакет org.junit не існує". Це пов’язано з оператором import у моєму вихідному коді. Правильне ім'я пакета в JUnit 4. * - org.junit. *, Тоді як у версії 3. * це junit.framework. *

Думаю, я знайшов документацію щодо кореня проблеми на веб- сайті http://maven.apache.org/plugins/maven-surefire-plugin/examples/junit.html, але поради, здається, призначені для експертів Maven. Я не розумів, що робити.


21
Я не працював з Maven 3, але моє перше припущення полягало б у тому, що ваш тестовий клас знаходиться у src / main / java, а ваш POM визначає junit як тестову залежність (тобто значення елемента "scope" - "test" "). Однак я не можу сказати точно, не побачивши свій POM і не знаючи структуру вашого проекту.
Сара Робертс

2
Maven не наполягає на JUnit, що тим, хто це робить, повинні бути ви ... схоже, ви не розташували свої тестові класи у правильному розташуванні src / test / java ... і, звичайно, pom був би надзвичайно корисним.
khmarbaise

Відповіді:


52

Просто щоб отримати відповідь із повним рішенням, яке допоможе відвідувачам:

Все, що вам потрібно зробити, це додати залежність від junit pom.xml. Не забувайте<scope>test</scope>

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.11</version>
  <scope>test</scope>
</dependency>

1
Так, версія вашого junit має значення. Я оновив його з 3.8.1 до 4.11, і це вирішило мою проблему.
Mahsa2,

змінив його з 3.11 на 4.11, і він теж працює, але мені цікаво, як це сталося для попередньої версії junit.
Тійна

45

@ Денніс Робертс: Ви були абсолютно праві: мій тестовий клас знаходився в src / main / java. Також значенням елемента "scope" у POM для JUnit було "test", хоча саме таким воно і повинно бути. Проблема полягала в тому, що я був неакуратним під час створення тестового класу в Eclipse, в результаті чого він створювався в src / main / java, встановленому з src / test / java. Це стало легше побачити у поданні Провідника проекту Eclipse після запуску "mvn eclipse: eclipse", але ваш коментар змусив мене це побачити першим. Дякую.


Я перемістив деякі файли з тесту на основний, і мій junit Assert почав видавати помилку. Видалення <scope> тесту </scope> вирішило проблему. Дякую!
pMan

я перемістив один файл тесту з основного на тест. Потім maven компілює успіх за допомогою junit <scope> test </scope>. Велике спасибі
eleforest

Неймовірно, у мене була така сама проблема. А оскільки Дженкінс не піклувався про мій тест в src / main, я навіть не помітив.
Пітер Де Бі

19

моя проблема полягала в рядку всередині мого. У pom.xmlмене був рядок, який <sourceDirectory>${basedir}/src</sourceDirectory>видаляв цей рядок, і maven використовував звичайні папки структури, що вирішує мою проблему


1
Він працює для мене після видалення <sourceDirectory> src <<sourceDirectory> його працює
prashant thakre



4

У мене була та сама проблема. Все, що я зробив, було - з файлу pom.xml я видалив залежність для junit 3.8 і додав нову залежність для junit 4.8. Тоді я зробив maven clean та maven install. Це зробило трюк. Щоб перевірити, після встановлення maven я перейшов до залежностей project-> properties-build path-> maven і побачив, що тепер jarit 3.8 jar зник!!, Замість цього вказано jarit 4.8 jar. класно !!. Тепер мій тест працює як шарм. Сподіваюся, це якось допоможе ..


Так, але відповідь @ FrVaBe робить так, що коли ваш колега отримує ваш код (і ваш pom.xml), йому / їй не доведеться знов з’ясовувати ваше рішення. Це просто буде працювати коректно.
Русс Бейтман

4

Моя справа була простим недоглядом.

Я помістив декларацію залежності JUnit всередину <dependencies>під <dependencyManagement/>вузол, а не <project/>у файл POM. Правильний спосіб:

<project>
<!-- Other elements -->
    <dependencies>
    <!-- Other dependencies-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
    </dependencies>
<project>

4

Як ви оголосили версію?

<version>4.8.2</version>

Майте на увазі значення цієї декларації, що пояснюється тут (див. ПРИМІТКИ) :

При оголошенні "звичайної" версії, такої як 3.8.2 для Junit, це внутрішньо представляється як "дозволити що-небудь, але віддайте перевагу 3.8.2". Це означає, що при виявленні конфлікту Maven може використовувати алгоритми конфлікту для вибору найкращої версії. Якщо ви вказали [3.8.2], це означає, що буде використано лише 3.8.2 і нічого іншого.

Для примусового використання версії 4.8.2 спробуйте

<version>[4.8.2]</version>

Оскільки у вас немає інших залежностей у вашому проекті, не повинно виникати конфліктів, що спричиняють вашу проблему. Перша декларація повинна працювати для вас, якщо ви можете отримати цю версію зі сховища. Ви успадковуєте залежності від батьківського пам?


1
Чи не <version>[4.8.2,)</version>краще було б примусити хоча б цю версію?
Йоахім Зауер,

3
@Joachim Sauer Використання діапазонів версій в даний час також вирішує версії SNAPSHOT ( посилання ) - і це дуже суперечливе обговорення, якщо це хороша концепція. Якщо ви не проти отримати версію SNAPSHOT, ваша пропозиція цілком корисна.
FrVaBe

3

У мене були файли в потрібних місцях, і просто видалення <scope>test</scope>із запису залежності JUnit вирішило проблему (я використовую JUnit 4.12). Я вважаю, що з testобсягом залежність просто ігнорувалася на етапі компіляції. Зараз все працює, навіть коли я телефоную mvn test.


3

У мене була досить подібна проблема в дочірньому проекті "test-utils" (додавання функцій, правил та тверджень до JUnit) батьківського проекту, що вводить залежності. Клас залежно від пакету org.junit.rules знаходився у src / main / java.

Тому я додав залежність від junit без обсягу тесту, і це вирішило проблему:

pom.xml проекту test-util:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
</dependency>

pom.xml батьківського проекту:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <scope>test</scope>
</dependency>

1

У мене була подібна проблема Eclipse зі складанням мого коду просто чудово, але Maven не вдавався під час компіляції тестів щоразу, незважаючи на те, що JUnit був у моєму списку залежностей, а тести були в / src / test / java /.

У моєму випадку у мене в списку залежностей була неправильна версія JUnit. Я писав тести JUnit4 (з анотаціями), але в якості своєї залежності мав JUnit 3.8.x. Між версіями 3.8.x та 4 JUnit вони змінили назву пакета з junit.framework на org.junit, тому Maven все ще порушує компіляцію за допомогою JUnit jar.

Я все ще не впевнений, чому Eclipse успішно скомпільовано. Він повинен мати власну копію JUnit4 десь у шляху до класу. Сподіваюся, це альтернативне рішення буде корисним для людей. Я дійшов цього рішення, перейшовши за посиланням Артура вище.


1

Я також зіткнувся з цією проблемою - я намагався втягнути об'єкт із джерела, і він працював у тестовому коді, але не в коді src. Для подальшого тестування я скопіював з коду блок коду і впустив його в код src, а потім негайно видалив рядки JUnit, щоб я просто знав, як тест втягував об'єкт. Тоді раптом мій код не скомпілювався.
Проблема полягала в тому, що коли я скинув код, Eclipse корисно вирішив усі класи, тому у мене були дзвінки JUnit з мого коду src, що було неправильним. Я мав би помітити попередження щодо невикористаного імпорту, але нехтував їх побачити.
Після того, як я видалив невикористаний імпорт JUnit у своєму файлі src, все працювало чудово.


1

У мене теж була така сама проблема, як показано нижче.

введіть тут опис зображення

Щоб вирішити проблему, нижче додані рядки до dependenciesрозділу на рівні програми build.gradle.

compile 'junit:junit:4.12'
androidTestCompile 'com.android.support.test:runner:0.5'

Потім збірка Gradle повідомляється після попередження.

Warning:Conflict with dependency 'com.android.support:support-annotations'. 
Resolved versions for app (25.1.0) and test app (23.1.1) differ. 
See http://g.co/androidstudio/app-test-app-conflict for details.

Щоб вирішити це попередження, до рівня build.gradle додається наступний розділ.

configurations.all {
    resolutionStrategy {
        force 'com.android.support:support-annotations:23.1.1'
    }
}

0

Знайдіть єдине рішення цієї помилки, якщо у вас є код у src / main / java Utils

<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.9.1</version>
</dependency>

0

Зміна версії junit це виправило для мене. Здається, версія 3.8.1 не працювала в моєму випадку. Проблема виправлена ​​після зміни на 4.12


-1

За замовчуванням maven переглядає ці папки для класів java та test відповідно - src / main / java та src / test / java

Коли src вказано з тестовими класами під вихідним кодом, а область для залежності від junit у pom.xml згадується як test - org.unit Maven не знайде.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.