我应该测试Spring Boot应用程序的main()方法吗?如果是的话,应该如何测试?
我应该测试Spring Boot应用程序的main()方法吗?如果是的话,应该如何测试?
创建Spring Boot应用程序时会生成两个类:
@SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }
第二个类是测试类:
@RunWith(SpringRunner.class) @SpringBootTest public class AppTest { @Test public void contextLoads() { } }
- 你可以注意到contextLoads测试是空的。我应该如何为contextLoads提供正确的测试?它应该保持为空吗?这样正确吗?还是我应该在里面放入一些内容?
更新:
- 为什么这个测试应该保留?如果我在应用程序中有更多的测试,我会知道Spring上下文是否已加载。这不是多余的吗?
我阅读了像这样的答案,但它没有给我一个明确的答案。
在Spring Boot应用程序中,main()
方法通常不涵盖在单元测试或集成测试中,因为Spring Boot测试不会调用main()
方法来启动Spring Boot应用程序。然而,有些人认为应该测试main()
方法,这样可以让度量工具(如Sonar)更加满意。但是,加载Spring上下文和加载应用程序需要时间,不值得为了在应用程序中增加0.1%的覆盖率而在每个开发者构建中添加它。以下是一个关于此问题的回答:
除了你提到的简单示例和其他帖子之外,如果在main()
方法中包含了一些逻辑,那么创建一个测试可能是有意义的。例如,当你向应用程序传递特定的参数并在main()
方法中处理它们时,这种情况就是如此。
解决方法:
1. 如果你的main()
方法没有任何逻辑,只是简单地启动Spring Boot应用程序,那么不需要编写测试。
2. 如果你的main()
方法包含了一些逻辑,你可以编写一个单元测试来测试这些逻辑。例如,你可以模拟传递给main()
方法的参数,并验证在不同参数情况下的应用程序行为是否符合预期。
当你使用Spring Initializer构建一个Spring Boot应用程序时,它会自动创建一个Application类和它的测试类。
代码中使用了@SpringBootTest
注解在测试类上,它告诉Spring Boot去查找一个主配置类(例如,带有@SpringBootApplication
注解的类)并使用它来启动一个Spring应用程序上下文。空的contextLoads()
方法是一个测试,用来验证应用程序是否能够成功加载Spring上下文。
对于空的方法,你不需要提供任何测试用例。尽管你可以做一些类似下面这样的事情来验证你的控制器或服务bean的上下文:
public class ApplicationContextTest { private MyController myController; private MyService myService; public void contextLoads() throws Exception { assertThat(myController).isNotNull(); assertThat(myService).isNotNull(); } }
所以,你是否应该测试Spring Boot应用程序的main()方法呢?答案是不需要。因为这个方法只是用来启动应用程序的,它不涉及任何业务逻辑。相反,你应该专注于测试应用程序中的控制器、服务和其他组件的功能。
希望这个解答对你有帮助!