有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java两种类型的spring测试的优缺点是什么

在我目前的项目中,我们正在开发微服务(web应用)。 在单元测试中,我们试图覆盖85-90%的代码。我注意到了使用spring进行测试的两种方法:

  • 注入控制器并直接调用其方法
  • 形成一个适当的请求,您可以在其中指定cookie、头。。。然后打个电话

此外,我们无法使用1方法测试身份验证

明年春天应该使用哪种测试方法?每种类型的优点是什么

{pr 1}$

JUnit方法#1



@LotsOfAnnotations
class ControllerTest1 {
    @Autowired
    private MyController myController;
    @Test
    public String verboseNameTest() {
        // Mock 3rd party calls
        ....
        // Form request
        MyRequest request = new MyRequest();
        // Invoke testing method
        myController.handle(request);
        // Assert
    }
}

JUnit方法#2


@LotsOfAnnotations
class ControllerTest2 {
    @Autowired
    private TestRestTemplate testTemplate;
    private MockRestServiceServer server;
    @Autowired
    private MockMvc mockMvc;
    @Autowired
    private WebApplicationContext webAppContext;

    @Before
    public void setup() {
        server = MockRestServiceServer.createServer(testTemplate.getRestTemplate());
        mockMvc = MockMvcBuilders.webAppContextSetup(this.webAppContext).build();
    }
    @Test
    public String verboseNameTest() {
        // Mock 3rd party calls
        ....
        // Form request
        String jsonStringRequest = "{}";
        RequestBuilder requestBuilder = MockMvcRequestBuilders
                    .post("/path")
                    .contentType(MediaType.APPLICATION_JSON)
                    .content(jsonStringRequest);
        // Make a call
        MvcResult result = this.mockMvc
                    .perform(requestBuilder)
                    .andExpect(status().isOk())
                    .andReturn();
        // Assert
    }
}


共 (1) 个答案

  1. # 1 楼答案

    据我所知,你需要了解什么时候模拟服务,什么时候直接打电话

    在第一种方法中,您直接调用web服务,比如说,您有一个庞大的代码库,同时有多个开发人员在工作,这样您可以在类中获得不断的更新,如果您想要测试您的代码片段(这就是您使用JUnit的原因),那么直接调用可能会导致错误/测试失败因为有人可能改变了什么

    在第二种方法中,模拟基本上消除了这种可能性,方法是模拟代码需要的其他服务,从而使代码测试更容易

    但有些人会质疑,当你甚至没有测试到某一点的全部内容时,模拟有什么用,但模拟的主要原因是只测试你的代码片段,而不考虑代码所依赖的其他服务。此外,如果您谈到进行实际的服务调用,那么这应该是集成测试或端到端测试的一部分