Есть ли особая конфигурация для использования SpringRunner с junit5? - PullRequest
0 голосов
/ 07 апреля 2020

Мой проект микросервиса, основанный на платформе Spring-boot и всех моих модульных тестах, выполняемых с помощью Spring Runner.

@RunWith(SpringRunner.class)

При добавлении этих аннотаций импортируется следующая библиотека:

import org.springframework.test.context.junit4.SpringRunner;

Как мне настроить тестовые классы для работы с junit5?

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Для использования JUnit Jupiter (он же JUnit 5) больше не требуется ˋ @RunWith (SpringRunner.class) ˋ, поскольку это механизм JUnit 4. В последних версиях Spring / Spring Boot поддержка JUnit 5 поставляется «из коробки», например, с помощью «spring-boot-starter-test».

Я рекомендую исключить зависимости от JUnit 4 в файле Maven / Gradle, чтобы уменьшить вероятность путаницы в JUnit 4 и 5.

Вот статья, которая показывает основы: https://howtodoinjava.com/spring-boot2/testing/junit5-with-spring-boot2/

0 голосов
/ 08 апреля 2020

Первая аннотация @RunWith (SpringRunner.class) используется для обеспечения моста между функциями тестирования Spring Boot и JUnit. SpringRunner.class обеспечивает полную поддержку загрузки контекста Spring и внедрения зависимостей бинов в тестах. @SpringBootTest создает тесты ApplicationContext через SpringApplication, которые будут использоваться в наших тестах. Он загружает весь контейнер начиная со встроенного сервера и создает веб-среду.

В нашем тесте мы можем имитировать c реальную веб-среду, задавая его как RANDOM_PORT, который также загружает WebServerApplicationContext. Встроенный сервер запускается и прослушивает произвольный порт.

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {YourPackage.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class YourClassTest {

    @LocalServerPort
    private int port;

    @Autowired
    TestRestTemplate restTemplate;
    HttpHeaders headers = new HttpHeaders();

    @ParameterizedTest
    @JsonFileSource(resources = "/param.json")
    void createBusinessEntity(JsonObject object){
      ....
    }
}

@ Аннотация LocalServerPort предоставляет нам введенный порт HTTP, который был выделен во время выполнения. Это удобная альтернатива для @Value ("$ {local.server.port}").

Для доступа к стороннему REST-сервису в приложении Spring мы используем Spring RestTemplate или TestRestTemplate - удобную альтернативу, которая подходит для интеграционных тестов, внедряя его в наш тестовый класс. С зависимостью spring-boot-starter-test в нашем проекте мы можем получить доступ к классу «TestRestTemplate» во время выполнения.

В нашем тестовом методе мы используем junit- json -params, Junit 5 библиотека, которая предоставляет аннотации для загрузки данных из JSON строк или файлов в параметризованных тестах. Мы также аннотировали метод аннотацией @ParameterizedTest, чтобы дополнить библиотеку ниже. Он используется для обозначения аннотированного метода параметризованным методом тестирования. Этот метод не должен быть частным или статическим c. Они также должны указать хотя бы один аргумент ArgumentsProvider через @ArgumentsSource или соответствующую составную аннотацию.

Наш @ArgumentsSource JSON файл @JsonFileSource (resources = "param. json"), который мы помещаем в тест. пакет ресурсов. @JsonFileSource позволяет вам использовать JSON файлы из пути к классам. Он поддерживает отдельные объекты, массивы объектов и JSON примитивы.

Объект JSON, извлеченный из файла, привязывается к параметру метода "object", который он преобразует в объект POJO, в данном случае , наша модель сущности.

В Pom. xml мы должны импортировать эти библиотеки ...

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>

        <exclusions>
            <exclusion>
                <groupId>com.vaadin.external.google</groupId>
                <artifactId>android-json</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

       <dependency>
            <groupId>net.joshka</groupId>
            <artifactId>junit-json-params</artifactId>
            <version>5.5.1-r0</version>
        </dependency>

        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-junit-jupiter</artifactId>
            <version>${mockito.version}</version>
        </dependency>

        <dependency>
            <groupId>org.junit</groupId>
            <artifactId>junit-bom</artifactId>
            <version>${junit-jupiter.version}</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>

Взгляните на эти статьи в посте на DZone и в моем блоге, где Вы можете получить доступ к полному образцу и объяснениям шаг за шагом, как протестировать микросервис с пружинной загрузкой, используя Junit 5. https://dzone.com/articles/microservices-in-publish-subscribe-communication-u https://www.jeevora.com/2019/11/18/publish-subscribe-messaging-systems/

...