Переопределение значения свойства в тесте Micronaut

#java #micronaut

#java #micronaut

Вопрос:

Использование @Property метода тестирования, похоже, не вступает в силу.

Это мой application.yml

 greeting: Hello
  

Application.java

 @Controller
public class Application {

    @Property(name = "greeting")
    String greeting;

    @Get
    String hello() {
        return greeting   " World!";
    }

    public static void main(String[] args) {
        Micronaut.run(Application.class, args);
    }
}
  

Теперь test1 проходит, как ожидалось, но test2 сбой.

 @MicronautTest//(rebuildContext = true)
public class DemoTest {

    @Inject
    @Client("/")
    HttpClient client;

    @Test
    void test1() {
        assertEquals(
                "Hello World!",
                client.toBlocking().retrieve(GET("/"))
        );
    }

    @Property(name = "greeting", value = "Bonjour")
    @Test
    void test2() {
        assertEquals(
                "Bonjour World!",
                client.toBlocking().retrieve(GET("/"))
        );
    }
}
  

Вывод

 org.opentest4j.AssertionFailedError: expected: <Bonjour World!> but was: <Hello World!>
  

Если я использовал rebuildContext = true , HttpClient он не переконфигурируется с новым портом, и второй тест завершается с ошибкой:

 Connect Error: Connection refused: no further information: localhost/127.0.0.1:[some random port]
  

Я разместил этот код на GitHub по адресу https://github.com/salah3x/micronaut-test-property-override

Это ошибка или я что-то упускаю?

Комментарии:

1. Если вы добавляете @Property(name = "greeting", value = "Bonjour") в тестовый класс (а не методы в тесте), влияет ли это на один или оба метода тестирования для вас?

2. @JeffScottBrown Добавление его в тестовый класс влияет на оба теста, поэтому test1 сбой при test2 прохождении

3. @JeffScottBrown это что-то, что было исправлено в Micronaut? Я все еще сталкиваюсь с этим с версией 3.7.5

4. «это что-то, что было исправлено в Micronaut? » — Я не знаю. TBH Я не понимал, что аннотация поддерживается на основе каждого метода тестирования.

5. Если ваш Application класс отмечен знаком @Refreshable , я бы ожидал, что тест, как написано, пройдет.

Ответ №1:

Кажется, что ручное обновление в EmbeddedServer сочетании с @MicronautTest(rebuildContext = true) делает тесты успешными.

 @MicronautTest(rebuildContext = true)
public class DemoTest {

    @Inject
    @Client("/")
    HttpClient client;

    @Inject
    EmbeddedServer server;

    @Test
    void test1() {
        assertEquals(
                "Hello World!",
                client.toBlocking().retrieve(GET("/"))
        );
    }

    @Property(name = "greeting", value = "Bonjour")
    @Test
    void test2() {
        server.refresh();
        assertEquals(
                "Bonjour World!",
                client.toBlocking().retrieve(GET("/"))
        );
    }
}
  

Но это скорее обходной путь, чем решение, поскольку в документах указано, что оно должно быть автоматически выбрано.

Комментарии:

1. Возможно @BeforeEach , метод установки для запуска server.refresh() перед каждым методом тестирования является жизнеспособным вариантом.