#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()
перед каждым методом тестирования является жизнеспособным вариантом.