【发布时间】:2012-01-16 20:25:10
【问题描述】:
我有一些遗留的东西,想通过测试来覆盖它。 有以下方法,我不知道如何使用模拟进行测试。
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”我需要做这样的设置(如上)
- 存根请求
- 存根服务
- 具有 3 个期望的模拟 responseBuilder(2 个 addElement 和 1 个构建)
是不是太多了?这样的设置是不是太复杂了?我在这里“过度模拟”了吗?
我可以考虑将所有 responseBuilder 的东西放到单独的协作者中,但是这对我来说有点疯狂,因为我刚刚提取了 ResponseBuilder 本身。
我怀疑我在这里写单元测试时遗漏了一些重要的点。
【问题讨论】:
标签: java unit-testing mocking