编程语言
首页 > 编程语言> > java-我以正确的方式使用模拟吗?

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