我应该测试 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() 方法以及如何测试?的主要内容,如果未能解决你的问题,请参考以下文章

我应该测试 Spring Boot Application 的 main() 方法以及如何测试?

Spring Boot:测试控制器层时是不是应该测试验证

Spring Boot核心原理

Spring Boot 属性配置

Spring Boot的配置文件

Elasticsearch Spring boot 集成测试