如何测试主类的弹簧启动应用程序

2022-08-31 11:51:14

我有一个应用程序,我的入门类看起来像一个标准类。因此,我为我的所有功能创建了许多测试,并将摘要发送到sonarqube以查看我的覆盖范围。spring-boot@SpringBootApplication

对于我的入门课程,Sonarqube告诉我,我只有60%的覆盖率。因此,平均覆盖率并不像预期的那样好。

enter image description here

我的测试类只是默认类。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = ElectronicGiftcardServiceApplication.class)
public class ElectronicGiftcardServiceApplicationTests {

    @Test
    public void contextLoads() {
    }
}

那么,如何在应用程序的起始类中测试主类呢?


答案 1

所有这些答案似乎都过分了。
您添加测试不是为了让指标工具满意。
加载应用程序的 Spring 上下文需要时间。不要在每个开发人员版本中添加它,只是为了在应用程序中赢得大约0.1%的覆盖率。
在这里,您不只涵盖 1 个公共方法中的 1 个语句。在通常编写数千个语句的应用程序中,它在覆盖范围方面没有任何意义。

第一个解决方法是:使你的Spring Boot应用程序类内部没有声明bean。如果您有它们,请在配置类中移动它们(以使它们仍被单元测试覆盖)。然后在测试覆盖率配置中忽略您的 Spring Boot 应用程序类。

第二种解决方法:如果您确实需要涵盖调用(例如出于组织原因),请为其创建一个测试,但要创建一个集成测试(由持续集成工具执行,而不是在每个开发人员构建中执行),并清楚地记录测试类的目的:main()

import org.junit.Test;

// Test class added ONLY to cover main() invocation not covered by application tests.
public class MyApplicationIT {
   @Test
   public void main() {
      MyApplication.main(new String[] {});
   }
}

答案 2

你可以做这样的事情

@Test
public void applicationContextLoaded() {
}

@Test
public void applicationContextTest() {
    mainApp.main(new String[] {});
}

推荐