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

80

Я пытаюсь создать простой проект Java с Maven. В моем pom-файле я объявляю JUnit 4.8.2 единственной зависимостью. Тем не менее Maven настаивает на использовании JUnit версии 3.8.1. Как мне это исправить?

Проблема проявляется в сбое компиляции: «пакет org.junit не существует». Это из-за оператора импорта в моем исходном коде. Правильное имя пакета в 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
Да, версия вашего юнита имеет значение. Я обновил его с 3.8.1 до 4.11, и это решило мою проблему.
Mahsa2
изменил его с 3.11 на 4.11, и он тоже работает, но мне интересно, как это случилось с более ранней версией junit.
Tiina
45

@Dennis Roberts: Вы были абсолютно правы: мой тестовый класс располагался в src / main / java. Также значение элемента «scope» в POM для JUnit было «test», хотя так оно и должно быть. Проблема заключалась в том, что я был небрежно при создании тестового класса в Eclipse, в результате чего он был создан в src / main / java, вставленном из src / test / java. Это стало легче увидеть в представлении Eclipse Project Explorer после запуска «mvn eclipse: eclipse», но именно ваш комментарий заставил меня увидеть это первым. Благодарю.

Хасби
источник
Я переместил некоторые файлы из test в main, и мой junit Assert начал выдавать ошибку. Удаление <scope> test </scope> устранило проблему. Спасибо!
pMan
я переместил один тестовый файл из основного в тестовый. Затем maven успешно скомпилирует с помощью junit <scope> test </scope>. Большое спасибо
eleforest
Невероятно, но у меня была такая же проблема. А поскольку Дженкинса не волновал мой тест в src / main, я даже не заметил.
Питер Де Би
19

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

дуб
источник
1
Он работает для меня после удаления <sourceDirectory> src <<sourceDirectory>, он работает
prashant thakre
12

удаление тега области в pom.xml для junit сработало ..

Манишанкар Парамешваран
источник
4
Это плохое решение, потому что теперь вы отправляете свои тестовые классы junit в свой двоичный файл prod.
avgvstvs 01
5

У меня такая же проблема. Все, что я сделал, это - из файла pom.xml я удалил зависимость для junit 3.8 и добавил новую зависимость для junit 4.8. Затем я сделал maven clean и maven install. Это сделало свое дело. Чтобы проверить, после установки maven я перешел проект-> свойства-путь сборки-> зависимости maven и увидел, что теперь jar junit 3.8 исчез!, Вместо этого отображается jar junit 4.8. прохладный!!. Теперь мой тест проходит как шарм .. Надеюсь, это как-то поможет ..

Steer360
источник
Да, но ответ @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>

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

FrVaBe
источник
1
Не <version>[4.8.2,)</version>лучше ли форсировать хотя бы эту версию?
Иоахим Зауэр
3
@Joachim Sauer Использование диапазонов версий в настоящее время также разрешает SNAPSHOT версий ( ссылка ) - и это очень controversal обсуждается , если это понятие хорошо. Если вы не против получить версию SNAPSHOT, ваше предложение вполне применимо.
FrVaBe 05
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>
Bludwarf
источник
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 где-то в пути к классам. Надеюсь, это альтернативное решение будет полезно людям. Я достиг этого решения после того, как перешел по ссылке Артура выше.

BrionS
источник
1

Я также столкнулся с этой проблемой - я пытался получить объект из источника, и он работал в тестовом коде, но не в коде src. Для дальнейшего тестирования я скопировал блок кода из теста и поместил его в код src, а затем сразу удалил строки JUnit, так что я просто понял, как тест вытягивает объект. И вдруг мой код не компилируется.
Проблема заключалась в том, что, когда я вставил код, Eclipse услужливо разрешил все классы, поэтому у меня были вызовы JUnit, исходящие из моего кода src, что было неправильно. Я должен был заметить предупреждения о неиспользованном импорте вверху, но не заметил их.
Как только я удалил неиспользуемый импорт JUnit в моем файле src, все заработало прекрасно.

LConrad
источник
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'
    }
}
MNS
источник
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.

abhimanyu.varma
источник