Spring Boot集成测试以空响应体响应 - MockMvc

11 浏览
0 Comments

Spring Boot集成测试以空响应体响应 - MockMvc

我看到了类似的问题,但是我还没有找到适合我的解决方案,所以我希望通过提供足够的细节来解决这个问题。

所以我有以下的类:

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestController {
    @Mock
    private Controller controller;
    private MockMvc mockMvc;
    @InjectMocks
    private SearchService service;
    @Before
    public void setUp(){
        MockitoAnnotations.initMocks(this);
        this.mockMvc = MockMvcBuilders.standaloneSetup(controller).setControllerAdvice(new GlobalExceptionHandler()).build();
    }
    @Test
    public void getSearchResults() throws Exception{
        this.mockMvc.perform(post("/something/search").header("header1","1").header("header2","2")
            .content("MY VALID JSON REQUEST HERE")
            .contentType(MediaType.APPLICATION_JSON)).andDo(print());
    }
}

上述代码打印结果如下:

MockHttpServletRequest:
    HTTP Method = POST
    Request URI = /something/search
     Parameters = {}
      Headers = {Content-Type=[application/json], header1=[1], header2=[2]}
Handler:
    Type = com.company.controller.Controller
    Method = public org.springframework.http.ResponseEntity com.company.controller.Controller.getSearchResults(com.company.SearchRequest,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String) throws java.io.IOException
Async:
    Async started = false
     Async result = null
Resolved Exception:
    Type = null
ModelAndView:
    View name = null
    View = null
    Model = null
FlashMap:
    Attributes = null
MockHttpServletResponse:
            Status = 200
     Error Message = null
           Headers = {}
      Content type = null
              Body = 
     Forwarded URL = null
    Redirected URL = null
           Cookies = []

即使我要搜索的数据在我的本地弹性服务器中不可用(实际上是可用的),它应该返回带有“{}”的body而不是为空。所以我对它为什么会建立连接并返回状态码200有点困惑。

这是我的控制器类:

@CrossOrigin
@RestController
@RequestMapping(value = "/something")
@Api("search")
@Path("/something")
@Produces({"application/json"})
@Consumes({"application/json"})
public class Controller {
    @Autowired
    private SearchService searchService;
    @POST
    @PATH("/search")
    @Consumes({"application/json"})
    @Produces({"application/json"})
    @RequestMapping(value = "/search", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, consumes MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity getSearchResults(
        @ApiParam(value = "json string with required data", required = true) @Valid @RequestBody SearchRequest request,
        @RequestHeader(required = true) @ApiParam(value = "header1", required = true) @HeaderParam("header1") String header1,
        @RequestHeader(required = true) @ApiParam(value = "header2", required = true) @HeaderParam("header2") String header2
    ) throws IOException {
        //some logic
        return new ResponseEntity(Object, HttpStatus.OK);
    }
}

此外,如果我在请求中提供了一些不正确的值(仍然是正确的json),我会收到有效的错误响应。有点奇怪。

感谢帮助的任何人!:/

0
0 Comments

Spring Boot中的集成测试中,当使用MockMvc进行测试时,可能会出现响应为空的问题。出现这个问题的原因是在测试中没有正确地模拟被调用的方法。

解决这个问题的方法是使用Mockito框架提供的Answers.CALLS_REAL_METHODS功能。通过设置这个功能,可以让被调用的方法真正地执行,而不是被模拟掉。

具体的解决方法如下:

(answer = Answers.CALLS_REAL_METHODS)
private SearchService service;

通过上述代码,可以将service对象设置为使用CALLS_REAL_METHODS功能,在测试中调用service方法时,会真正地执行这些方法,而不是返回模拟的结果。这样可以确保测试的准确性,并避免响应为空的问题。

,解决Spring Boot集成测试中响应为空的问题的方法是使用Mockito框架的Answers.CALLS_REAL_METHODS功能,通过设置这个功能,可以让被调用的方法真正地执行,避免返回空的结果。

0
0 Comments

问题的原因是测试中的MockMvc无法正确响应请求并返回空的响应体。这可能是由于未正确设置MockMvc或模拟服务的原因。

解决方法是更改测试中的thenReturn方法为thenCallRealMethod方法,以便调用实际的方法。这可能会解决问题并正确地返回响应。

下面是完整的解决方法:

首先,确保在测试类中导入所需的类,包括SpringRunner、SpringBootTest、MockMvc和MediaType。

然后,在测试类中创建一个私有的MockMvc实例和一个模拟的SearchService实例。

在setUp方法中,使用Mockito的when方法来模拟SearchService的someMethod方法,并返回预期的响应。

在getSearchResults方法中,使用this.mockMvc.perform方法来执行POST请求。在请求中,设置请求的路径、标头和内容,并指定请求的内容类型为APPLICATION_JSON。

然后,使用andExpect方法来验证请求的状态码是否为200。

最后,使用andDo方法来执行自定义操作。在这个例子中,我们可以在mvcResult对象中验证响应。

这样,我们就完成了对Controller的集成测试,并验证了响应是否符合预期。

希望这篇文章对你有帮助!

0