【问题标题】:Should I test the main() method of Spring Boot Application and how?我应该测试 Spring Boot Application 的 main() 方法以及如何测试?
【发布时间】: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() {
    }

}
  1. 您可以注意到 contextLoads 测试是空的。我应该如何为 contextLoad 提供正确的测试?也许它应该保持空白?这是正确的吗?还是我应该在里面放点东西?

更新:

  1. 为什么要保留这个测试?如果我在应用程序中有更多测试,我会知道是否加载了弹簧上下文。不就是过度

我阅读了this 之类的答案,但没有给出明确的答案。

【问题讨论】:

  • 实际上您的问题是:“为什么要在 Spring Boot 应用程序中测试 main 方法?”而不是“如何”。
  • 为什么,如果是,如何。 :)

标签: java spring spring-boot testing


【解决方案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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-06-14
      • 2021-12-13
      • 2016-11-06
      • 2016-02-27
      • 2020-02-09
      • 2021-11-21
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多