java-我以正确的方式使用模拟吗?
作者:互联网
我有一些旧的东西,想通过测试来涵盖.
有以下方法,我不知道如何使用模拟进行测试.
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
> testTransactionResponseToResponse
> testTokenSetInResponse
> testFormattedResponseBuilt
> testResponseSent
例如.执行“ testResponseBuilt”,我需要像这样进行设置(如上所述)
>存根请求
>存根服务
>模拟带有3个期望值的responseBuilder(2个addElement和1个构建)
那里不是太多吗?这样的设置不是太复杂了吗?我在这里“夸张”吗?
我可以考虑将所有的responseBuilder内容放到单独的协作器中,但是对我来说有点疯狂,因为我刚刚提取了ResponseBuilder本身.
我怀疑我在这里编写单元测试时错过了一些要点.
解决方法:
这些测试对您来说太过分了.看来您的方法的职责是正确设置并发送响应(从代码判断-命名可能会更好,例如现在列出的事务是什么?).这就是应该在这里进行测试的地方.
编辑:
从第二个角度看,似乎大部分工作是由responseBuilder完成的,剩下的代码只是对其进行设置.因此,您真正可以在此处测试的是它是否提供了预期的数据(一次或两次测试),最后是否发送了响应(第二次/第三次测试).请注意,没有必要检查.build是否被调用,因为缺少它会导致发送测试失败.
这意味着您需要模拟和验证对responseBuilder(.add方法)和响应(.send)的期望.测试响应格式属于responseBuilder测试,就像测试是否正确提取事务属于服务测试一样.
(您也可以验证服务是否使用正确的参数进行了硬编码,但这仅在您要谨慎时才使用)
总体而言,我会剔除测试#1和#4并将重点放在其余的测试上.
并且为了验证这些期望,您必须将剩余的依赖项存根.没有真正的解决办法.您需要在确定您愿意编写多少代码以便测试单行代码(以及是否值得)之间找到最有效的点.
标签:unit-testing,mocking,java 来源: https://codeday.me/bug/20191201/2083980.html