简体   繁体   English

Spring Boot,测试主应用类

[英]Spring Boot, test main application class

I have a logic in my application class in a Spring Boot app, but I don't know how to do an unit and an integration test to cover it.我在 Spring Boot 应用程序的应用程序类中有一个逻辑,但我不知道如何进行单元和集成测试来覆盖它。

Here is the code.这是代码。

    @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();
        }
    }

It's a command line application that runs with 'java -jar mlg.jar'这是一个使用“java -jar mlg.jar”运行的命令行应用程序

If you are using Spring initializr , this test will be created for you.如果您使用的是Spring initializr ,则会为您创建此测试。 You may call it an integration test because it will try to start your application context (thus integrating all classes inisde it).您可以将其称为集成测试,因为它将尝试启动您的应用程序上下文(从而集成所有类)。 It goes something like this:它是这样的:

@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...
    }
}

And for your specific domain logic, you can try to assert if the list is created but I would put that in a separate class as a unit test.对于您的特定域逻辑,您可以尝试断言列表是否已创建,但我会将其放在单独的类中作为单元测试。

I managed to do it this way, using mockito-core 3.8 and mockito-inline BUT was not able to get Jacoco coverage doing it this way:我设法这样做,使用 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));
        }
    }
}

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM