如何使用JUnit在没有@SpringBootApplication的情况下测试Java Spring启动应用程序?
我创建了一个SpringBootJava库,它有一组执行特定功能的实用程序。然后,该库可以跨多个需要其实用程序的应用程序使用。该库被设计为一个Spring引导应用程序,以允许在应用程序上下文中注入这些实用程序 现在,我希望在其中一个实用程序上执行JUnit测试,以确保它正常工作。但是,由于此应用程序基本上是实用程序的集合,而不是独立的应用程序,因此它没有用如何使用JUnit在没有@SpringBootApplication的情况下测试Java Spring启动应用程序?,java,spring,spring-boot,junit,junit5,Java,Spring,Spring Boot,Junit,Junit5,我创建了一个SpringBootJava库,它有一组执行特定功能的实用程序。然后,该库可以跨多个需要其实用程序的应用程序使用。该库被设计为一个Spring引导应用程序,以允许在应用程序上下文中注入这些实用程序 现在,我希望在其中一个实用程序上执行JUnit测试,以确保它正常工作。但是,由于此应用程序基本上是实用程序的集合,而不是独立的应用程序,因此它没有用@SpringBootApplication注释的主类或主方法。现在,当我运行JUnit测试时,它出现了一个错误 java.lang.Ille
@SpringBootApplication
注释的主类或主方法。现在,当我运行JUnit测试时,它出现了一个错误
java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...)
可以测试这个Java库吗,或者我们应该只在将使用这个库的应用程序中编写测试用例吗?我认为您所说的有些矛盾:
@SpringBootApplication
注释类。由此我得出结论,它不是一个spring引导应用程序,而是一个spring引导启动程序模块
在这种情况下,您不应该使用@SpringBootTest
注释,因为它模拟启动spring引导应用程序的方式(查找主类,根据包结构扫描包,加载配置等等)。你不需要这些。好吧,从技术上讲,您仍然可以创建一个用@SpringBootApplication
注释的主类,并将其放入相关包中的src/test/java/../
,但这并没有真正意义
所以基本上你有两个选择:
spring.factories
,它使用此java配置文件创建自动配置(在模块X中添加对库的依赖项,它会自动加载库中定义的bean)
这个
@ExtendsWith
(@RunWith
用于JUnit4)与Spring引导无关,它的行为就像一个“普通的”spring,您可以自动连接bean、创建模拟bean、配置缓存等等。我不这么认为。如果它只是一个库,您只能运行单元测试。集成测试是应用程序的责任。或者您可以创建一个使用您的代码的演示应用程序,它是特定于您的代码的spring启动应用程序,并编写集成测试。看看Bramnik提到的spring.factories。看看这个答案->和这个博客,谢谢你的详细解释。在我的例子中,我实际上使用的是组件扫描。你能解释一下哪些注释会因此而改变吗?但既然你的库注定要与spring boot集成,我认为Java可以配置将是一个更好的选择。Spring boot应用程序(模块X)可能无法在您的软件包上启用组件扫描,根据Spring boot约定,对于初学者,您应该编写一个自动配置真的。。。
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {MyLibraryConfiguration.class}
public class SampleLibraryTest {
@Autowired
private SomeBeanFromTheLibrary theBean;
@Test
public void testFoo() {
....
}
}