如何使用JUnit在没有@SpringBootApplication的情况下测试Java Spring Boot应用程序?

时间:2019-12-10 03:53:28

标签: java spring spring-boot junit junit5

我创建了一个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库,还是应该仅在将使用该库的应用程序中编写测试用例?

1 个答案:

答案 0 :(得分:1)

我认为您所说的有些矛盾:

  1. 创建了一个库...该库被设计为Spring Boot应用程序。
  2. 库可用于需要其实用程序的多个应用程序中。

如果您实现“ 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/.../中,但这实际上没有任何意义。

所以基本上您有两个选择:

  1. 您完全可以在没有spring的情况下测试实用程序,就好像该实用程序只是Java类一样,用Mockito模拟依赖项就可以了。由于这些测试速度很快,因此它是最佳选择。

  2. 您可以通过使用应用程序创建的所有必需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,并缓存配置等等