我应该测试弹簧启动应用程序的main()方法以及如何测试



当我创建 Spring 启动应用程序时,它会生成 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. 就像你可以注意到上下文负载测试是空的。我应该如何为上下文加载提供正确的测试?也许它应该保持空置?正确吗?或者我应该在里面放点东西?

更新:

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

我读了这样的答案,但它没有给我一个明确的答案。

实际上,单元/集成测试没有涵盖 Spring Boot 应用程序的 main() 方法,因为 Spring 启动测试不会调用 main() 方法来启动 Spring Boot 应用程序。

现在我认为这篇文章的所有答案似乎矫枉过正。
他们希望添加main()方法的测试,以使公制工具满意(Sonar(。
加载 Spring 上下文和加载应用程序需要时间
不要在每个开发人员构建中添加它,只是为了在应用程序中赢得大约 0.1% 的覆盖率。
我对此补充了一个答案。


除了您的简单示例和您引用的其他帖子之外,如果您包含一些逻辑,那么绝对意义上,为 main() 方法创建一个测试可能是有意义的。 例如,当您将特定参数传递给应用程序并在 main() meethod 中处理它们时,就是这种情况。

将其留空。 如果在加载应用程序上下文时发生异常,则测试将失败。此测试只是说"我的应用程序是否会加载而不会引发异常">

第二个问题的更新

您要保留此测试的原因是,当某些事情失败时,您希望找到根本原因。 如果应用程序上下文无法加载,则可以假定所有其他失败的测试都是由于此原因。 如果上述测试通过,则可以假定失败的测试与加载上下文无关。

当您使用 Spring 初始值设定项构建 Spring 引导应用程序时。它会自动创建应用程序及其测试类

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
@SpringBootTest
class ApplicationTest {
  @Test
  void contextLoads() {
  }
}

请注意在测试类上使用@SpringBootTest注释,它告诉 Spring 引导查找一个主配置类(例如,一个带有 @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();
    }
}

最新更新