Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用JUnit在没有@SpringBootApplication的情况下测试Java Spring启动应用程序?_Java_Spring_Spring Boot_Junit_Junit5 - Fatal编程技术网

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

如何使用JUnit在没有@SpringBootApplication的情况下测试Java Spring启动应用程序?,java,spring,spring-boot,junit,junit5,Java,Spring,Spring Boot,Junit,Junit5,我创建了一个SpringBootJava库,它有一组执行特定功能的实用程序。然后,该库可以跨多个需要其实用程序的应用程序使用。该库被设计为一个Spring引导应用程序,以允许在应用程序上下文中注入这些实用程序 现在,我希望在其中一个实用程序上执行JUnit测试,以确保它正常工作。但是,由于此应用程序基本上是实用程序的集合,而不是独立的应用程序,因此它没有用@SpringBootApplication注释的主类或主方法。现在,当我运行JUnit测试时,它出现了一个错误 java.lang.Ille

我创建了一个SpringBootJava库,它有一组执行特定功能的实用程序。然后,该库可以跨多个需要其实用程序的应用程序使用。该库被设计为一个Spring引导应用程序,以允许在应用程序上下文中注入这些实用程序

现在,我希望在其中一个实用程序上执行JUnit测试,以确保它正常工作。但是,由于此应用程序基本上是实用程序的集合,而不是独立的应用程序,因此它没有用
@SpringBootApplication
注释的主类或主方法。现在,当我运行JUnit测试时,它出现了一个错误

java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...)

可以测试这个Java库吗,或者我们应该只在将使用这个库的应用程序中编写测试用例吗?

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

  • 创建了一个库…它被设计为Spring引导应用程序
  • 库可以跨多个需要其实用程序的应用程序使用
  • 如果您实现了“1”,那么就有一个配置了SpringBootMaven/gradle插件的模块,用于创建应用程序的JAR,它是一个库

    但是,如果您有模块X希望使用您的库,那么在这个模块中添加对库的依赖是不可能的,spring boot JAR工件不是Java意义上的JAR。。。因此,这在IDE和maven中都不起作用(我的意思是,从技术上讲,您会有编译错误)

    然后编写一些完全有意义的东西:你说库本身没有一个主类/
    @SpringBootApplication
    注释类。由此我得出结论,它不是一个spring引导应用程序,而是一个spring引导启动程序模块

    在这种情况下,您不应该使用
    @SpringBootTest
    注释,因为它模拟启动spring引导应用程序的方式(查找主类,根据包结构扫描包,加载配置等等)。你不需要这些。好吧,从技术上讲,您仍然可以创建一个用
    @SpringBootApplication
    注释的主类,并将其放入相关包中的
    src/test/java/../
    ,但这并没有真正意义

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

  • 您可以在根本不使用spring的情况下测试实用程序,就好像该实用程序只是一个Java类一样,使用Mockito模拟依赖关系,这样就可以了。由于这些测试速度很快,因此您可能是最佳选择

  • 您可以通过加载包含应用程序创建的所有必需bean的spring上下文来运行IntegrationTest

  • 现在,尽管您可以使用组件扫描(在本例中,您需要稍微不同的注释),但在示例中,我假设您使用的是java配置,在那里注册库的所有bean,并创建一个
    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() {
          ....
        }
    }