2017-10-11 5 views
2

私はJUnit mockitoを初めて使用しています。このテスト機能はSpring Restリソース用に書かれています。上記のシナリオでは Spring-Restでの行動JUnitテストの作成のポイントは何ですか?

@Test 
public void getAllMessageHappyTest() throws Exception { 
    List<Message> messageList = new ArrayList<>(); 
    messageList.add(new Message(1,"Hello")); 
    messageList.add(new Message(5,"Hello world")); 
    messageList.add(new Message(3,"Hello World, G!")); 

    when(messageService.getAllMessages()).thenReturn(messageList); 
    RequestBuilder requestBuilder = MockMvcRequestBuilders.get("/messages/").accept(MediaType.APPLICATION_JSON); 
    MvcResult mvcResult = mockMvc.perform(requestBuilder).andReturn(); 

    String expected = ""; // expected 
    JSONAssert.assertEquals(expected,mvcResult.toString(),false); 
} 

、私が持っている when(messageService.getAllMessages()).thenReturn(messageList);私(またはチームのメンバーによる)によって を書かれているmessageListを返すと私はまたによって を書き込まれますString expectedと返さJSONを比較しています私(またはチームの同じメンバー)。だから両方のものが同じ人によって書かれているので、そのような種類のテストをすることのポイントは何か。

+0

テストでハードコードされた動作は、一部のサービス用です。これはコントローラレイヤーをテストします。 –

答えて

1

質問が正しく理解されていれば、これが問題です。テストを書く人は、テストが冗長であるか、少なくとも限定された価値があるかもしれないという期待を(JSON文字列の形で)ハードコードするためです。おそらくあなたの質問へのサブテキストは、基礎をなすエンドポイントを書いた人が期待を提供し、それが成功しなければならないので、その成功があらかじめ決められていれば、それはほとんど価値がないからです。

しかし、関係なく、誰のテストを書き込み、誰がコード被試験、あなたは上記示したため、値を持つサンプルテスト書き込み:それは再調整JSON以上のものをテストし

  • を、それもテストします。 ..
    • RESTエンドポイントのマッピングが、それはREST層は、いくつかのJSONを生成シリアライザを使用しているJSON
    • を受け入れ"/messages/"という名前のエンドポイントが公開されていることが正しいすなわちされていることを
  • このテストケースを引き続き実行することで、このエンドポイントの予想される動作が、このコードでもはや作業していなくても(つまり、チームの他のメンバーが)回帰セーフティネットとして機能します。
  • 将来的にコードが変更される可能性があります。この場合、このテストケースは今後の開発が可能なベースラインを提供します。
  • テストケースは、コードのドキュメントの形式を提供します。このコードベースに精通していない人は、コードがどのように動作するかを理解するためにテストを見直すことができます。

さらに、このテストケースを拡張して無効なrepsonses、セキュリティ保護されていないアクセス試行などの悲しいパスに対するテストを含めることができ、それによってテストカバレッジが向上します。

アップデート1:このコメントotの応答:

誰かが実際のコードの変更を行い、今、実際のコードを作成した後、JSONの異なる種類を生産している場合でもを(言わない必要に応じて)も、テストケースが渡されるのは、ハードコーディングされ、期待されるときにハードコードされるからです。だからポイントは何ですか? ないテストが何をするかある

String json = "..."; 

when(foo.getJson()).thenReturn(json); 

assertEquals(json, foo.getJson()); 

富栄:

は、このようなテストは明らかに意味がありません。代わりに、あなたのテストでは、レスポンス(JSONの形式)が、あなたの嘲笑されたmessageService.getAllMessages()によって返された応答のシリアライズされた形式と一致すると主張しています。したがって、あなたのテストでは、エンドポイント - >コントローラマッピング、インターセプタ、およびフィルタ(もしあれば)など、Spring MVCレイヤのさまざまな側面とともに、シリアライゼーションピースを扱います。

+0

誰かが実際のコードを変更しても、実際のコードを作成した後であっても、JSONの種類が異なっていても(たとえ必要でないとしても)テストケースが合格になります。 。だからポイントは何ですか? – stephanie

関連する問題