gpt4 book ai didi

java - 我是否以正确的方式使用模拟?

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:59:27 27 4
gpt4 key购买 nike

我有一些遗留的东西,想通过测试来覆盖它。有以下方法,我不知道如何使用模拟进行测试。

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
  • 测试响应已发送

例如要执行“testResponseBuilt”,我需要像这样进行设置(如上所述)

  • stub 请求
  • stub 服务
  • 用 3 个期望模拟 responseBuilder(2 个 addElement 和 1 个构建)

是不是太多了?这样的设置是不是太复杂了?我在这里“夸大”了吗?

我可以考虑将所有 responseBuilder 的东西放入单独的协作者中,但它对我来说有点疯狂,因为我刚刚提取了 ResponseBuilder 本身。

我怀疑我在这里编写单元测试时遗漏了一些重要的点。

最佳答案

你对这些测试有点过头了。似乎您的方法的责任是正确设置和发送响应(从代码判断 - 命名可能更好,例如,现在列出什么交易?)。这就是应该在这里测试的内容。

编辑:

再看一眼,似乎大部分工作都是由 responseBuilder 完成的 - 其余代码只是设置它。所以你真正可以在这里测试的是它是否提供了预期的数据(这是一次或两次测试),最后是否发送了响应(第二次/第三次测试)。请注意,检查是否调用了 .build 并不是必需的,因为它的缺失会导致响应发送测试失败。

这意味着您需要模拟和验证对responseBuilder(.add 方法)和response(.send )。测试响应格式属于responseBuilder测试,就像测试是否正确获取交易属于service测试。

(您还可以验证是否使用正确的参数调用了 service,因为它是硬编码的,但这只是在您非常谨慎的情况下)

总的来说,我会剔除测试 #1 和 #4 并专注于剩余的测试。

并且为了验证这些期望,您必须清除剩余的依赖项。没有真正的解决办法。您需要在确定您愿意编写多少代码以测试单行代码(以及是否值得)之间找到最佳平衡点。

关于java - 我是否以正确的方式使用模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8885832/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com