我应该测试 Spring Boot Application 的 main() 方法以及如何测试?
Posted
技术标签:
【中文标题】我应该测试 Spring Boot Application 的 main() 方法以及如何测试?【英文标题】:Should I test the main() method of Spring Boot Application and how? 【发布时间】:2018-08-26 23:36:30 【问题描述】:当我创建 Spring Boot 应用程序时,它会生成 2 个类:
@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 测试是空的。我应该如何为 contextLoad 提供正确的测试?也许它应该保持空白?这是正确的吗?还是我应该在里面放点东西?
更新:
-
为什么要保留这个测试?如果我在应用程序中有更多测试,我会知道是否加载了弹簧上下文。不就是过度。
我阅读了this 之类的答案,但没有给出明确的答案。
【问题讨论】:
实际上您的问题是:“为什么要在 Spring Boot 应用程序中测试 main 方法?”而不是“如何”。 为什么,如果是,如何。 :) 【参考方案1】:实际上,Spring Boot 应用程序的main()
方法并没有包含在单元/集成测试中,因为Spring Boot 测试不会调用main()
方法来启动Spring Boot 应用程序。
现在我认为这个post 的所有答案似乎都过分了。
他们想要添加对 main()
方法的测试,以使度量工具(Sonar)变得快乐。
加载 Spring 上下文并加载应用程序需要时间。
不要为了在您的应用程序中赢得大约 0.1% 的覆盖率而在每个开发人员构建中添加它。
我对此添加了一个答案。
除了您的简单示例和您引用的另一篇文章之外,从绝对意义上讲,如果您在其中包含一些逻辑,则为 main()
方法创建测试可能是有意义的。例如,当您通过特定的应用程序的参数,并在 main()
meethod 中处理它们。
【讨论】:
【参考方案2】:留空。如果在加载应用程序上下文时发生异常,则测试将失败。这个测试只是说“我的应用程序是否会在不引发异常的情况下加载”
第二个问题的更新
您希望保留此测试的原因是,当某件事失败时,您希望找到根本原因。如果您的应用程序上下文无法加载,您可以假设所有其他失败的测试都是由于这个原因。如果上述测试通过,您可以假设失败的测试与加载上下文无关。
【讨论】:
所以也许我应该放入某种断言?确定它是否正确。 不,不需要。 此测试只是确保您的应用程序加载无异常。你没有什么可断言的。如果在创建 Spring bean 时抛出任何异常,则测试将失败。 我编辑了问题,如果你能回答第二部分:)【参考方案3】:当您使用 Spring Initializer 构建 Spring Boot 应用程序时。它自动创建应用程序及其测试类
@SpringBootApplication
public class Application
public static void main(String[] args)
SpringApplication.run(Application.class, args);
@SpringBootTest
class ApplicationTest
@Test
void contextLoads()
注意在测试类上使用@SpringBootTest
注解,它告诉Spring Boot 寻找一个主配置类(例如一个带有@SpringBootApplication 的类)并使用它来启动一个Spring 应用程序上下文。空contextLoads()
是一个测试,验证应用是否能够成功加载Spring上下文。
您不需要为空方法提供任何测试用例。虽然你可以做这样的事情来验证你的控制器或服务 bean 上下文:-
@SpringBootTest
public class ApplicationContextTest
@Autowired
private MyController myController;
@Autowired
private MyService myService;
@Test
public void contextLoads() throws Exception
assertThat(myController).isNotNull();
assertThat(myService).isNotNull();
【讨论】:
以上是关于我应该测试 Spring Boot Application 的 main() 方法以及如何测试?的主要内容,如果未能解决你的问题,请参考以下文章