これに似た質問を見たことがありますが、自分に合った解決策がまだ見つからないので、解決するのに十分な詳細を付けて投稿します。
だから私は次のクラスを持っています:
@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)、有効なエラー応答を受け取ります。少し変わっています。
助けてくれてありがとう!!! :/
このテストを試してください。このテストは、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
});
}
}