繁体   English   中英

SpringBoot MVC后响应实体返回null

[英]SpringBoot MVC Post Response Entity returning null

响应enitity应该返回一个http状态为OK / 200的新ResponseEntity。 但是,在我测试期间,它返回null,我可以看到它被设置为null但不明白为什么甚至如何。 我确信这是一件很简单的事我错过了但却无法看到它。

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

Vars / services实例化 create被设置为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);
}

正如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);
    }

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

正如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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM