SpringBoot MVC Post Response实体返回null

时间:2019-05-05 15:47:38

标签: java spring model-view-controller mockito

响应实体应返回http状态为OK / 200的新ResponseEntity。但是,在测试期间,它返回为null,我可以看到将其设置为null的位置,但不知道为什么甚至如何。我确信这是我错过的一件简单的事情,但看不到它。

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

Vars/services instantiated create being set to 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);
}

2 个答案:

答案 0 :(得分:2)

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

    @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教程。

答案 1 :(得分:1)

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

 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。