进行 spring 云合同测试时无法找到 @SpringBootConfiguration
Unable to find a @SpringBootConfiguration when doing spring cloud contract test
我有一个 spring 作为生产者的启动项目,它有 API 个端点,通过 RouterFunction 创建。
API 调用服务然后调用 JPA 存储库的端点调用处理程序。
我们使用 liquibase 创建数据库表,并使用 postgressql testcontainer 编写测试用例。
我已经为制作人编写了基础 class 如下:
@SpringBootTest
public abstract class RestBase extends TestBase {
@Autowired
private AccountHandler accountHandler;
@BeforeEach
public void setup() {
RestAssuredWebTestClient.webTestClient(WebTestClient.bindToRouterFunction(
new RouterConfig(accountHandler).routes()).build());
}
}
但是,当我尝试 运行 mvn clean install 时,出现以下堆栈跟踪。
[INFO] Running com.example.RestTest
2021-09-02 13:46:26.207 INFO 25420 --- [ main] .b.t.c.SpringBootTestContextBootstrapper : Neither @ContextConfiguration nor @ContextHierarchy found for test class [com.example.RestTest], using SpringBootContextLoader
2021-09-02 13:46:26.208 INFO 25420 --- [ main] o.s.t.c.support.AbstractContextLoader : Could not detect default resource locations for test class [com.example.RestTest]: no resource found for suffixes {-context.xml, Context.groovy}.
2021-09-02 13:46:26.208 INFO 25420 --- [ main] t.c.s.AnnotationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.example.RestTest]: RestTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.127 s <<< FAILURE! - in com.example.RestTest
[ERROR] com.example.RestTest Time elapsed: 0.127 s <<< ERROR!
java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test
2021-09-02 13:46:26.346 INFO 25420 --- [ main] c.e.e.c.ContainerEnvironmentResource : Stopping all test containers.
2021-09-02 13:46:26.778 INFO 25420 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2021-09-02 13:46:26.781 INFO 25420 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2021-09-02 13:46:26.795 INFO 25420 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
[INFO]
[INFO] Results:
[INFO]
[ERROR] Errors:
[ERROR] RestTest » IllegalState Unable to find a @SpringBootConfiguration, you need to...
如何解决这个问题?我的基础测试有问题吗class?
路由器配置 class 如下所示:
@Configuration
@RequiredArgsConstructor
public class RouterConfig {
private final AccountHandler accountHandler;
@Bean
public RouterFunction<ServerResponse> routes (){
return route()
.GET("/accounts",accountHandler::retrieveAccountByFilter)
.build();
}
}
我的意思是错误消息中的字面意思是您应该做什么。只需在@SpringBootTest 注解中提供配置 class 即可。同样对于合同测试,您不应该启动任何数据库或存储库。你应该嘲笑他们。
确保您正在测试的 classes 与您的 @SpringBootApplication
class 在同一个命名空间中,或者在包含您的 @SpringBootApplication
的命名空间下的命名空间中] class.
例如,如果您的应用 class 在 com.example.demo.MyApplication
但您正在测试的 class 是 com.example.MyClass
S
或者如果它们需要位于单独的命名空间树中,您可以尝试将应用列表 class 添加到您的 @SpringBootTest 注释中,例如
@SpringBootTest(classes=YouAppClassName.class)
public abstract class RestBase extends TestBase {
...
}
我有一个 spring 作为生产者的启动项目,它有 API 个端点,通过 RouterFunction 创建。
API 调用服务然后调用 JPA 存储库的端点调用处理程序。
我们使用 liquibase 创建数据库表,并使用 postgressql testcontainer 编写测试用例。
我已经为制作人编写了基础 class 如下:
@SpringBootTest
public abstract class RestBase extends TestBase {
@Autowired
private AccountHandler accountHandler;
@BeforeEach
public void setup() {
RestAssuredWebTestClient.webTestClient(WebTestClient.bindToRouterFunction(
new RouterConfig(accountHandler).routes()).build());
}
}
但是,当我尝试 运行 mvn clean install 时,出现以下堆栈跟踪。
[INFO] Running com.example.RestTest
2021-09-02 13:46:26.207 INFO 25420 --- [ main] .b.t.c.SpringBootTestContextBootstrapper : Neither @ContextConfiguration nor @ContextHierarchy found for test class [com.example.RestTest], using SpringBootContextLoader
2021-09-02 13:46:26.208 INFO 25420 --- [ main] o.s.t.c.support.AbstractContextLoader : Could not detect default resource locations for test class [com.example.RestTest]: no resource found for suffixes {-context.xml, Context.groovy}.
2021-09-02 13:46:26.208 INFO 25420 --- [ main] t.c.s.AnnotationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.example.RestTest]: RestTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.127 s <<< FAILURE! - in com.example.RestTest
[ERROR] com.example.RestTest Time elapsed: 0.127 s <<< ERROR!
java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test
2021-09-02 13:46:26.346 INFO 25420 --- [ main] c.e.e.c.ContainerEnvironmentResource : Stopping all test containers.
2021-09-02 13:46:26.778 INFO 25420 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2021-09-02 13:46:26.781 INFO 25420 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2021-09-02 13:46:26.795 INFO 25420 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
[INFO]
[INFO] Results:
[INFO]
[ERROR] Errors:
[ERROR] RestTest » IllegalState Unable to find a @SpringBootConfiguration, you need to...
如何解决这个问题?我的基础测试有问题吗class?
路由器配置 class 如下所示:
@Configuration
@RequiredArgsConstructor
public class RouterConfig {
private final AccountHandler accountHandler;
@Bean
public RouterFunction<ServerResponse> routes (){
return route()
.GET("/accounts",accountHandler::retrieveAccountByFilter)
.build();
}
}
我的意思是错误消息中的字面意思是您应该做什么。只需在@SpringBootTest 注解中提供配置 class 即可。同样对于合同测试,您不应该启动任何数据库或存储库。你应该嘲笑他们。
确保您正在测试的 classes 与您的 @SpringBootApplication
class 在同一个命名空间中,或者在包含您的 @SpringBootApplication
的命名空间下的命名空间中] class.
例如,如果您的应用 class 在 com.example.demo.MyApplication
但您正在测试的 class 是 com.example.MyClass
S
或者如果它们需要位于单独的命名空间树中,您可以尝试将应用列表 class 添加到您的 @SpringBootTest 注释中,例如
@SpringBootTest(classes=YouAppClassName.class)
public abstract class RestBase extends TestBase {
...
}