2017-11-08 1 views
0

私は私の@RestControllerのいずれかの簡単なテストを書き、入力@RequestBodyが正しくPersonDTOにマップされていることを主張したい:@RestControllerの@RequestBodyをjunitでテストするには?

@RestController 
public class PersonServlet { 
    @PostMapping("/person") 
    public PersonRsp find(@RequestBody PersonDTO dto) { 
     //business logic 
    } 
} 

public class PersonDTO { 
    private String firstname, lastname; 
} 

は質問:どのように私はそのサーブレットにJSONリクエストボディを送ることができます。さらに、PersonDTOフィールドのすべてが正しく設定されているかどうかを調べます。

これはおそらくこれに似ていますが、解析されたDTOを調べる/スパイする方法はわかりません。

@RunWith(SpringRunner.class) 
@WebMvcTest(PersonSerlvet.class) 
public class PersonTests { 
    @Autowired 
    private MockMvc mvc; 

    @Test 
    public void testExample() throws Exception { 
     this.mvc.perform(get("/person")) 
       .andExpect(status().isOk()); 
    } 
} 

@Duplicate marker:これは、リンクされた質問の複製ではありません(これは、応答本文の文字列の読み方です)。私は実際にリクエストボディのテストを求めています。

+0

ロガーあり? –

+0

私はロガー出力の検証が単体テストの良いアサーションであるとは思わない! – membersound

+0

ユニットテストを依頼するのではなく、統合テストを行いたいのですが、テストで入力をテストし、実稼動のためにそれを変更しない場合は、モックアペンダーまたはメソッドインターセプターを使用できます。 –

答えて

2

テストDTOにJSONのdeserialisingが本当にあなたのコントローラの責任ではない、あなたは外部ライブラリである基礎となるオブジェクトマッパー、テストされることになる(ジャクソン、Gsonを... ??)

どのライブラリが使用されているのかわからないが、アプリケーションの使用方法をテストする場合は、アプリケーションフレームワークと同様の方法で適切なオブジェクトマッパーを手動で構築し、そのAPIを使用してJson StringからTarget DTOにシリアル化する必要があります

+0

私は参照してくださいが、私は春のコンテキスト内で作成されたオブジェクトマッパーをテストしたいと思います異なる(つまりテスト中にのみ作成された)オブジェクトマッパー。 – membersound

+0

ええ、それは理解できる、あなたはテストのコンテキストで直接autowireことができるですか@Autowired プライベートObjectMapperのobjectMapper; ? – tom01

関連する問題