当前位置: 首页 > 知识库问答 >
问题:

如何测试Spring boot应用程序的主类

陶福
2023-03-14

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

对于我的初级课程,Sonarqube告诉我,我只有60%的覆盖率。因此,平均覆盖率不如预期。

我的测试类只是默认类。

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

    @Test
    public void contextLoads() {
    }
}

那么如何在应用程序的入门类中测试我的主类呢?

共有3个答案

樊奇思
2023-03-14

我有同样的目标(有一个运行main()方法的测试),我注意到,简单地添加一个测试方法,比如@fg78nc said,实际上会“启动”应用程序两次:一次是通过spring boot test framework,一次是通过显式调用mainApp。main(新字符串[]{}),我觉得它并不优雅。

我最终编写了两个测试类:一个带有@SpringBootTest注释和空测试方法Application ationContextLoade(),另一个没有@SpringBootTest(只有RunTo(SpringRunner.class))调用main方法。

SpringBootApplicationTest

package example;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.boot.test.context.SpringBootTest;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootApplicationTest {

  @Test
  public void contextLoads() {
  }
}

应用开始测试

package example;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
public class ApplicationStartTest {
  @Test
  public void applicationStarts() {
    ExampleApplication.main(new String[] {});
  }
}

总的来说,应用程序仍然启动了两次,但因为现在有两个测试类。当然,仅使用这两种测试方法似乎有些过分,但通常会利用SpringBootTest设置向类SpringBootApplicationTest添加更多测试。

訾俊名
2023-03-14

你可以这样做

@Test
public void applicationContextLoaded() {
}

@Test
public void applicationContextTest() {
    mainApp.main(new String[] {});
}
滑文昌
2023-03-14

所有这些答案似乎都有些过头了<添加测试并不是为了让度量工具满意<加载应用程序的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[] {});
   }
}
 类似资料:
  • 使用spring-boot时,一切工作都很好。尽管如此,在spring-boot中已删除了注释和。我试图将代码重构为新版本,但我做不到。对于以下测试,我的应用程序在测试之前没有启动,http://localhost:8080返回404: 如何重构测试以使其在Spring-Boot1.5中工作?

  • 这是我使用SpringBoot的第一天,我试图理解体系结构,因此我开始构建一个hello world应用程序: 在我的pom.xml中,在maven-shade-plugin下,我将mainClass声明如下: 文件目标是src/main/java/com/demo/helloworld.java,该文件中的代码是: 我错过了什么?

  • 集成测试: 当我偶尔运行这个测试时,一切都很好,但是当我和其他测试一起运行它时,没有使用模拟的ServerThroughRabbitMQ,所以一些spring缓存强制使用旧的rabbit侦听器。 我试图调试它,我可以看到,正确的bean被autowired到测试中,但由于某些原因旧监听器使用(旧bean字段instanceID=1新mocked bean instanceID=3),测试失败(不确

  • 我的SpringBoot应用程序中有一个控制器: 我想在mocks的帮助下,将其与服务分开进行测试。如何实施?

  • 我想在intellij Idea中以调试模式启动spring-boot maven应用程序,但当我创建断点时,应用程序不会挂起,而是会继续。我读了很多题目,但还是不明白怎么做。你能帮我决定最好的行动方案吗。 但是当请求LocalHost:5005/MyPage时,我会出现错误101(NET::ERR_CONNECTION_RESET)。似乎有些maven参数没有指定。 下面是我在pom.xml中的