【问题标题】:SpringBoot MVC Post Response Entity returning nullSpringBoot MVC 后响应实体返回 null
【发布时间】:2019-05-05 15:47:38
【问题描述】:

响应实体应该返回一个新的 ResponseEntity,其 http 状态为 OK/200。然而,在我的测试过程中它返回为 null 我可以看到它被设置为 null 但不明白为什么甚至如何。我确信这是我错过的一件简单的事情,但只是看不到它。

从图片中可以看出,create var 为 null,但是,Mockitio 应该将其设置为 createBlogPostResponse1,所以我不确定为什么要设置 null。

感谢您提供这方面的任何信息和帮助。

测试

public static ResponseEntity createBlogPostResponse1 = new ResponseEntity(HttpStatus.OK);


@Test
public void createNewBlogPost() throws Exception {
    String url = TestHelper.URL + "/blogPost/createNewBlogPost";
    when(postService.createNewBlogPost(blogPost1)).thenReturn(TestHelper.createBlogPostResponse1);
    mockMvc.perform(post(url)
            .contentType(MediaType.APPLICATION_JSON_UTF8)
            .content(TestHelper.asJsonString(blogPost1)))
            .andExpect(status().isOk())
            .andReturn();

    verify(postService, times(1)).createNewBlogPost(blogPost1);
    verifyNoMoreInteractions(postService);
}

控制器

ResponseEntity create = postService.createNewBlogPost(cleanBlogPost);

服务

@Override
public ResponseEntity createNewBlogPost(BlogPost createNewBlogPost) {
    return new ResponseEntity(HttpStatus.OK);
}

【问题讨论】:

    标签: java spring model-view-controller mockito


    【解决方案1】:

    正如 JBnizet mockito 所指出的,在内部使用 equals 方法来匹配您的模拟方法调用中的参数。尝试为 BlogPost 类覆盖 equals 方法。如果您不想覆盖 equals 并且只想匹配模拟上的任何方法调用 - 使用 any() 匹配器:

        @Test
        public void createNewBlogPost() throws Exception {
            String url = TestHelper.URL + "/blogPost/createNewBlogPost";
            when(postService.createNewBlogPost(Mockito.any(BlogPost.class))).thenReturn(TestHelper.createBlogPostResponse1);
            mockMvc.perform(post(url)
                    .contentType(MediaType.APPLICATION_JSON_UTF8)
                    .content(TestHelper.asJsonString(blogPost1)))
                    .andExpect(status().isOk())
                    .andReturn();
    
            verify(postService, times(1)).createNewBlogPost(Mockito.any(BlogPost.class));
            verifyNoMoreInteractions(postService);
        }
    

    如果您想获得一些关于匹配器的基本知识,请尝试this 教程。

    【讨论】:

    • 使用 eq() 是没用的。 Mockito 默认使用 equals() 方法比较参数。不需要匹配器。
    • 谢谢你,我会看看发布的教程,我还更新了你的答案,因为测试中的验证也需要你的答案以确保完整的测试通过。
    【解决方案2】:

    如前所述,Mockito 依赖 equals() 进行参数匹配,但覆盖 equals() 以使单元测试成功通常不是一个好主意。 equals() 覆盖必须对相关类有所了解。如果压倒一切有意义,那就去做吧。 否则,这是一种替代方法,您可以使用 any() 匹配器结合检查参数属性值的内容,例如:

     when(postService.createNewBlogPost(Mockito.any(BlogPost.class)))
    .then( answer -> { 
                       BlogPost post = (BlogPost) invocation.getArguments()[0]; // get the first arg
                       Assert.assertEquals(blogPost1.getFoo(), post.getFoo());
                       Assert.assertEquals(blogPost1.getBar(), post.getBar());
                       return TestHelper.createBlogPostResponse1();
                       });
    

    虽然对于断言而不在对象上使用equals() 进行断言,但我更喜欢 AssertJ。

    【讨论】:

      猜你喜欢
      • 2021-06-26
      • 2018-09-28
      • 1970-01-01
      • 1970-01-01
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      • 2017-05-24
      相关资源
      最近更新 更多