Какой правильный протокол для определения теста в JUnit 5

Простой вопрос: что мне нужно сделать, чтобы написать тест, который вызывается в JUnit под управлением Maven? Я ознакомился с документацией, но, похоже, это неправильно. Я явно чего-то не понимаю.

Я определил тест следующим образом:

import org.junit.jupiter.api.Test;

public void class TestSet1 {

    @Test
    public void addition() {
        // ... perform test here
    }
    
}

Я бы запустил mvn clean test и запустил тесты 0/0. в другом репозитории он работал, поэтому я меняю местами и пробую ошибку, я обнаруживаю, что:

  1. метод тестирования должен начинаться с «тест»
  2. аннотация @Test не нужна

Что в итоге сработало:

public class TestSet1 {

    public void testAddition() {
        // ... perform test here
    }
    
}

Это противоречит документации. Вот Руководство пользователя JUnit 5, из которого был взят этот тестовый пример. В чем дело? В документации четко сказано, что первое должно работать, но это совершенно не сработало, и после долгих возни я обнаружил, что правила кажутся другими. Я воспроизвел это независимо в двух разных средах, на своем рабочем компьютере, а также на своем домашнем компьютере.

Или это то, как я настроил maven? Ниже мой файл POM, и если с ним что-то не так, сообщите мне. Ясно, что он загружает JUnit 5.9.2, а документация отмечена для JUnit 5.9.2.

ОБНОВЛЕНИЕ: как было предложено одним ответом, я указал версию для уверенности, но результат тот же.

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.purplehillsbooks</groupId>
  <artifactId>purple</artifactId>
  <version>3.2</version>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.target>8</maven.compiler.target>
    <maven.compiler.source>8</maven.compiler.source>
  </properties>
  
  <dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.9.2</version>
        <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-surefire-plugin -->
    <dependency>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>2.11</version>
    </dependency>
  </dependencies>
</project>

Вот полный фактический тестовый класс:

package com.purplehillsbooks.testcase;
import org.junit.jupiter.api.Test;
public class Test3 {

    public Test3() {
    }

    public void testAddition() {
        System.out.println("Test3.testAddition has run");
    }
    
    @Test
    public void addition() {
        System.out.println("Test3.addition has run");
    }
}

Вот результат выполнения этого:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.purplehillsbooks.testcase.Test3
Test3.testAddition has run
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.004 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

Изменились ли средства индикации теста? Я в растерянности, и, наверное, не я один.

UPDATE2: я добавил следующее в POM

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0</version>
            </plugin>
        </plugins>
    </pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
        </plugin>
    </plugins>
</build>

И теперь я получаю этот вывод:

[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.purplehillsbooks.testcase.Test3
Test3.addition has run
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.055 s - in com.purplehillsbooks.testcase.Test3
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]

Это правильно, но странно, что это не имеет ничего общего с JUnit, а только с SureFire.

Можете ли вы показать свой реальный код?

tgdavies 31.03.2023 02:03

Я только что проверил на одном из моих рабочих проектов. @Test требуется, и название метода, начинающееся с «тест», не имеет значения. Я думаю, что ваша проблема в другом. Попробуйте очистить проект вручную, а затем полностью перестроить проект. Я думаю, что у вас есть ошибки компиляции, которые вам не хватает.

markspace 31.03.2023 02:36

@markspace у вас есть явная верная конфигурация? Я смог воспроизвести это поведение без надежной конфигурации, mvn 3.8.1

tgdavies 31.03.2023 03:06

Нет, я просто запускаю свою IDE по умолчанию. Я не уверен, почему Maven или версия будут иметь значение.

markspace 31.03.2023 03:27

Если я запускаю тесты в IDEA, то pom не имеет значения. Если я запускаю через mvn package, это так.

tgdavies 31.03.2023 03:51
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Насколько я понимаю из вашего примера

import org.junit.jupiter.api.Test;

    public class TestSet1 {
    
        @Test
        public addition() {
            // ... perform test here
        }
        
    }

Вы пытаетесь поместить аннотацию Test в конструктор. Скорее всего вы хотели написать метод, который будет тестировать код, но забыли тип возвращаемого значения, в тестах он должен быть void. Вот что у вас должно получиться:

@Test
void addition() {}

Почти уверен, что это опечатка - в рабочей версии такая же ошибка. Вот почему я попросил реальный код: кто знает, как он выглядит на самом деле!

tgdavies 31.03.2023 02:16

Если это опечатка, то я не очень понимаю, как можно запустить тест без аннотации Test (-_-)

Nikita 31.03.2023 02:22

Мне очень жаль. Я сделал это в нескольких проектах в нескольких средах. Я упростил его здесь, скопировав код из документации для примера, потому что, конечно, реальный код имел 5 или 6 классов, задействованных сложным образом. Я не заметил, что в примере из документации отсутствовал возвращаемый тип. Я виновен в том, что привел пример, который на самом деле не был тем, что я собрал, но я совершенно уверен, что название должно быть таким, каким я его обнаружил, и что это репрезентативно. Извиняюсь за опечатку в том, что я написал здесь.

AgilePro 31.03.2023 15:22

Обновлен с АКТУАЛЬНЫМ кодом

AgilePro 31.03.2023 16:10
Ответ принят как подходящий

Я считаю, что это происходит потому, что вы используете более старую версию maven-surefire-plugin.

Добавьте это в свой помпон:

    <build>
        <!-- To define the plugin version in your parent POM -->
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>3.0.0</version>
                </plugin>
            </plugins>
        </pluginManagement>
        <!-- To use the plugin goals in your POM or parent POM -->
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

Теперь вы должны увидеть ожидаемое поведение.

Почему по умолчанию такие, я не знаю.

Да, это сделало это. Странно, как это поведение определяется SureFire, а не JUnit. Документация JUnit должна указать вам на документацию SureFire о назначении тестов. Документация JUnit должна относиться исключительно к поведению maven по умолчанию. Еще раз спасибо за совет. Я не знаю, как бы я нашел это иначе. Это делает поведение таким же, как в документации, однако у меня возникает соблазн использовать поведение по умолчанию, потому что чем меньше конкретных настроек у меня есть, тем лучше. Я не религиозен в отношении того или иного подхода, но просто хочу, чтобы он работал в будущем.

AgilePro 31.03.2023 16:25

Другие вопросы по теме