2017-11-09 6 views
2

私は、サーブレットエンドポイントの応答を検証する簡単なjunitテストを行っています。@RestControllerのResponseBodyをMockMvcのjunitテストでオブジェクトとして取得する方法は?

問題:javaオブジェクトPersonという応答を取得したいが、string/json/xml表現ではない。

これは可能ですか?

@RestController 
public class PersonController { 
    @GetMapping("/person") 
    public PersonRsp getPerson(int id) { 
     //... 
     return rsp; 
    } 
} 

@RunWith(SpringRunner.class) 
@WebMvcTest(value = PersonController.class) 
public class PersonControllerTest { 
    @Autowired 
    private MockMvc mvc; 

    @Test 
    public void test() { 
     MvcResult rt = mvc.perform(get("/person") 
       .param("id", "123") 
       .andExpect(status().isOk()) 
       .andReturn(); 

     //TODO how to cast the result to (Person) p? 
    } 
} 

答えて

3

あなたはこのようにそれをデシリアライズできます

String json = rt.getResponse().getContentAsString(); 
Person person = new ObjectMapper().readValue(json, Person.class); 

また、あなたが私の目標としてmockMvc

+0

直接アプローチがないのは良い解決策です。 – membersound

+0

さらに、応答オブジェクトJSONを '.andExpect(content()。json(" {'message': 'ok'} "));などで直接検証できます。 –

0

を@Autowireすることができます主に全体のセットアップをテストすることでした、オブジェクト自動設定と休憩コントローラの自動設定された春の手段で、私はちょうどエンドポint。そして、応答として入力パラメータが返されたので、私はそれを検証することができます:

@RestController 
public class PersonControllerMock { 
    @GetMapping("/person") 
    public PersonDTO getPerson(PersonDTO dto) { 
     return dto; 
    } 
} 


@RunWith(SpringRunner.class) 
@WebMvcTest(value = PersonControllerMock.class) 
public class PersonControllerTest { 
    @Autowired 
    private MockMvc mvc; 

    @Test 
    public void test() { 
     mvc.perform(get("/person") 
       .param("id", "123") 
       .param("firstname", "john") 
       .param("lastname", "doe") 
       .andExpect(status().isOk()) 
       .andExpect(jsonPath("$.firstname").value("john")) 
       .andExpect(jsonPath("$.lastname").value("doe")) 
       .andReturn(); 
    } 
} 
0

に限定されるものではない場合は、TestRestTemplate::getForEntityを使用することができますObjectMapper