我创建了一个Spring Boot Java库,该库具有一组执行某些功能的实用程序。然后,可以在需要其实用程序的多个应用程序中使用该库。该库被设计为Spring Boot应用程序,以允许将这些实用程序注入应用程序上下文中。
现在,我希望对其中一个实用程序执行JUnit测试,以确保其正常运行。但是,由于此应用程序基本上是实用程序的集合,而不是独立的应用程序,因此它没有使用@SpringBootApplication
注释的主类或主方法。现在,当我运行JUnit测试时,它会出现一个错误。
java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...)
是否可以测试该Java库,还是应该仅在将使用该库的应用程序中编写测试用例?
答案 0 :(得分:1)
我认为您所说的有些矛盾:
如果您实现“ 1”,则存在一个配置有spring boot maven / gradle插件的模块,用于创建应用程序的JAR库。
但是,例如,如果您有希望使用您的库的模块X,则无法在该模块中添加对库的依赖关系,那么Spring Boot JAR构件就不是Java Sense中的JAR ...因此,这不会不能同时在IDE和Maven中使用(从技术上讲,我的意思是您会遇到编译错误)。
然后,您编写完全有道理的东西:您说该库本身没有主类/ @SpringBootApplication
带注释的类。由此我得出结论,它不是Spring Boot应用程序,而是Spring Boot启动器模块。
在这种情况下,您不应使用@SpringBootTest
注释,因为它模仿了启动Spring Boot应用程序的方式(查找主类,根据软件包结构扫描软件包,加载配置等)。您不需要所有这些。嗯,也许从技术上讲,您仍然可以创建带有@SpringBootApplication
注释的主类,并将其放入相关包中的src/test/java/.../
中,但这实际上没有任何意义。
所以基本上您有两个选择:
您完全可以在没有spring的情况下测试实用程序,就好像该实用程序只是Java类一样,用Mockito模拟依赖项就可以了。由于这些测试速度很快,因此它是最佳选择。
您可以通过使用应用程序创建的所有必需bean加载spring上下文来运行整合测试。
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {MyLibraryConfiguration.class}
public class SampleLibraryTest {
@Autowired
private SomeBeanFromTheLibrary theBean;
@Test
public void testFoo() {
....
}
}
现在,尽管您可以使用组件扫描(在这种情况下,您将需要稍有不同的注释),但是在示例中,我假设您使用的是Java config,请在其中注册该库的所有bean并创建一个{ {1}}使用此Java配置文件创建自动配置(您在模块X中添加了对库的依赖关系,它会自动加载库中定义的bean)。
此spring.factories
(对于junit 4,@ExtendsWith
)与Spring Boot无关,它的行为就像一个“普通”弹簧,您可以自动装配bean,创建模拟bean,并缓存配置等等