我有一些遺留的東西,並希望通過測試來覆蓋它。 有以下方法,我不知道如何使用mock進行測試。我使用正確的方式嗎?
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 3個預計(2 addElement方法和1生成)
那裏不是太多嗎?這樣的設置是不是太複雜了?我在這裏「overmock」嗎?
我能想到把所有的東西responseBuilder成單獨的合作者,但它讓我有點瘋狂,因爲我剛剛提取ResponseBuilder本身。
我懷疑我在這裏寫單元測試錯過一些重要的點。
但是爲了設置一些模擬期望,我需要在測試中揭示一些內部結構,對吧?爲了獲得正確的響應格式,我需要準備responseBuilder以提供事務和令牌,所以我需要再次揭示內部消息。還是我完全失去了這裏? – grafthez 2012-01-16 20:55:10
@grafthez:檢查我的編輯 - 你是正確的,你想測試的是responseBuilder是否餵給正確的數據和是否發送響應。其他測試屬於不同的類別。 – 2012-01-16 21:09:39