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

时间:2018-03-18 07:33:30

标签: java spring spring-boot testing

当我创建Spring Boot Application时,它会生成2个类:

>>> import giturlparse
>>> url = giturlparse.parse('ssh://git@gitlab.com:3333/org/repo.git')
>>> url
Parsed(pathname='/org/repo.git', protocols=['ssh'], protocol='ssh', href='ssh://git@gitlab.com:3333/org/repo.git', resource='gitlab.com', user='git', port='3333', name='repo', owner='org')
>>> url.resource
'gitlab.com'

第二个是测试:

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}
  1. 就像你可以注意到contextLoads测试是空的。我应该如何为contextLoad提供正确的测试?应该保持空虚吗?这是对的吗?或者我应该把东西放进去?
  2. 更新

    1. 为什么要进行这项测试?如果我在应用程序中有更多测试,我将知道是否加载了spring上下文或nope。不仅过度
    2. 我像this这样的答案,但它没有给我一个明确的答案。

3 个答案:

答案 0 :(得分:5)

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

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

除了您的简单示例和您引用的其他帖子之外,从绝对意义上说,如果您包含一些逻辑,那么为main()方法创建测试可能是有意义的。例如,就像您一样将特定参数传递给应用程序,并在main() meethod。

中处理它们

答案 1 :(得分:3)

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

第二个问题的更新

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

答案 2 :(得分:0)

当您使用 Spring Initializer 构建 Spring 启动应用程序时。它自动创建应用程序及其测试类

@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 应用程序上下文。 Empty 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();
    }
}