web-dev-qa-db-ja.com

空のボディで応答するSpringBoot統合テスト-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.SearchResponse> 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 = []

私が検索しようとしているデータが私のローカルElasticサーバー(それはそうです)で利用できない場合でも、それは単に空ではなく「{}」で本文を返すはずです。だから私はそれが接続を確立してステータス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<SearchResponse> 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)、有効なエラー応答を受け取ります。少し変わっています。

助けてくれてありがとう!!! :/

9
adbar

このテストを試してください。このテストは、SpringBootのドキュメントによるものです。

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@AutoConfigureMockMvc
public class ControllerTest {


    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private SearchService service;

    @Before
    public void setUp(){
        when(service.someMethod(any()))
                .thenReturn(SomeResponse);
    }

    @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))
                .andExpect(status().isOk())
                .andDo(mvcResult -> {
                    //Verrify Response here
                });
    }
}