【问题标题】:Spring Boot, test main application classSpring Boot,测试主应用类
【发布时间】:2019-01-21 06:52:59
【问题描述】:

我在 Spring Boot 应用程序的应用程序类中有一个逻辑,但我不知道如何进行单元和集成测试来覆盖它。

这里是代码。

    @SpringBootApplication
    public class MlgApplication {

        public static void main(String[] args) throws IOException {
            ConfigurableApplicationContext run = SpringApplication.run(MlgApplication.class, args);

            ListBean ListBean = run.getBean(ListBean.class);
            ListBean.createList();
        }
    }

这是一个使用'java -jar mlg.jar'运行的命令行应用程序

【问题讨论】:

    标签: java spring unit-testing spring-boot integration-testing


    【解决方案1】:

    如果您使用Spring initializr,将为您创建此测试。您可以将其称为集成测试,因为它会尝试启动您的应用程序上下文(从而将所有类集成到其中)。它是这样的:

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class BootApplicationTests {
    
        @Test
        public void contextLoads() {
        // some more optional integration assertions here
        // like asserting number of beans, are they null, etc...
        }
    }
    

    对于您的特定域逻辑,您可以尝试断言是否创建了列表,但我会将其放在单独的类中作为单元测试。

    【讨论】:

      【解决方案2】:

      我设法做到了这一点,使用 mockito-core 3.8 和 mockito-inline 但无法以这种方式获得 Jacoco 覆盖:

      @SpringBootTest
      @ActiveProfiles("test")
      public class AutowireTest {
      
          private static final String ARG = "";
          private static final String[] ARGS = new String[]{ARG};
      
          @Autowired
          ConfigurableApplicationContext context;
      
          @Test  //Junit5
          public void main() {
              try (MockedStatic<Application> appStatic = Mockito.mockStatic(Application.class);
                   MockedStatic<SpringApplication> springStatic = Mockito.mockStatic(
                     SpringApplication.class)) {
                  appStatic.when(() -> Application.main(ARGS))
                      .thenCallRealMethod();
                  springStatic.when(() -> SpringApplication.run(Application.class, ARGS))
                      .thenReturn(context);
      
                  // when
                  Application.main(ARGS);
      
                  //then
                  appStatic.verify(times(1),
                      () -> Application.main(ARGS));
                  springStatic.verify(times(1),
                      () -> SpringApplication.run(Application.class, ARGS));
              }
          }
      }
      

      所以,我在这里问为什么:How to Unit test Spring-Boot Application main() method to get Jacoco test coverage

      【讨论】:

        猜你喜欢
        • 2018-03-20
        • 2018-06-10
        • 1970-01-01
        • 2017-09-03
        • 2016-11-06
        • 1970-01-01
        • 2016-07-01
        • 2020-07-21
        • 2018-10-18
        相关资源
        最近更新 更多