私はいくつかの遺産を持っており、それをテストでカバーしたいと思っています。 モックを使ってテストする方法がわからない次の方法があります。私はモックを正しい方法で使用していますか?
public String listTransactions(Request request, Response response) {
String transactionFamily = request.get("transactionFamily");
List transactions = service.fetchTransactions(transactionFamily);
responseBuilder.addElement("collection", transactions);
responseBuilder.addElement("token", tokenGenerator.next());
String formattedResponse = responseBuilder.build();
response.send(formattedResponse);
return null;
}
私の最初のアプローチでした:
public void testResponseIsBuilt() {
request = stub(Request.class);
request.method("get").with("transactionFamily").willReturn("dummyFamily");
response = mock(Response.class);
response.mehod("send").called(once());
service = stub(TransactionService.class);
service.method("fetchTransactions").willReturn(testTransactions);
responseBuilder = mock(ResponseBuilder.class);
responseBuilder.method("addElement").called(once()).with("collection", testTransactions);
responseBuilder.method("addElement").called(once()).with("token", sampleToken);
responseBuilder.method("build").called(once());
responder.setService(service);
responder.setResponseBuilder(responseBuilder);
responder.listTransactions(request, response);
}
私は単一のテストケースは、SUTの唯一の側面をカバーする必要があります知っています。
- testTransactionsFetchedForFamily
- testTransactionsAddedToResponse
- testTokenSetInResponse
- testFormattedResponseBuilt
- testResponseSent
例えば:だから、これを考慮すると、私はテストの次のセットを想像することができます"testResponseBuilt" 私は(上記のように)このように設定を行う必要がありスタブサービス
とモックresponseBuilder
- スタブ要求
- を実行しますそこにあまりにもないですか?そのような設定は複雑すぎるのではないですか?私はここで "オーバーモック"していますか?
私は、すべてのresponseBuilderのことを別の協力者にすることができますが、ResponseBuilder自体を抽出したのでちょっと狂っています。
ユニットテストを書く際に重要な点がいくつかあると思いますが、
しかし、いくつかの模擬期待を設定するには、私のテストでいくつかの内部構造を明らかにする必要がありますよね?そして、正しい応答形式を得るためには、私はresponseBuilderにトランザクションとトークンを提供する準備をする必要があるので、内部を再び明らかにする必要があります。あるいは、私はここで完全に失われていますか? – grafthez
@grafthez:私の編集を確認してください - あなたは正直なところです。あなたがテストしたいのは、responseBuilderに正しいデータが与えられているかどうか、そして応答が送られているかどうかです。他のテストは異なるクラスに属します。 –