У меня есть веб-приложение Spring Boot в качестве модуля Gradle foo
. (на самом деле они разделены на несколько модулей, но для простоты давайте рассмотрим их как один модуль).
Теперь я хотел бы добавить интеграционные тесты каратэ как отдельный модуль Gradle это зависит от приложения Spring Boot. Давайте назовем это bar
. Он должен работать как тесты JUnit и запускать веб-среду Spring Boot на произвольном порту.
Я достиг этого следующим образом:
foo
Веб-приложение Spring Boot build.gradle
:
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
foo
Точка входа в Spring Boot:
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
bar
Модуль интеграционных испытаний build.gradle
dependencies {
implementation project(':foo')
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
bar
Образец интеграционных испытаний
@SpringBootTest(classes = MyApplication.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class BarTest {
@LocalServerPort
int serverPort;
@Test
void test() {
// Simple example. This will run all the complex integration tests
assertEquals(8080, serverPort);
}
}
Обратите внимание, как тест интеграции в bar
ссылается на основную точку входа приложения MyApplication
в foo
в аннотации @SpringBootTest
.
Теперь возникает странная часть: Это работает нормально, когда я запускаю тест из моей IntelliJ IDE, но не работает, когда я запускаю из Gradle
Если я запускаю тест из моей IDE, первые строки показывают это:
10:12:03.327 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Neither @ContextConfiguration nor @ContextHierarchy found for test class [BarTest], using SpringBootContextLoader
Затем он продолжает раскручивать веб-контекст, пока он не будет полностью загружен и тест не пройден.
Но если я запускаю его из Gradle с --info, я вижу вместо этого следующее:
10:14:06.226 [Test worker] INFO org.springframework.test.context.support.DefaultTestContextBootstrapper - Neither @ContextConfiguration nor @ContextHierarchy found for test class [BarTest], using DelegatingSmartContextLoader
Он не раскручивает веб-контекст, и тест не пройден из-за невозможности внедрения @LocalServerPort
Похоже, он использует неправильный TestContextBootstrapper. Как это исправить?