gpt4 book ai didi

java - 使用内部有模拟的模拟进行单元测试

转载 作者:行者123 更新时间:2023-12-01 07:48:54 27 4
gpt4 key购买 nike

我需要对某个适用于 X 类型对象的方法进行单元测试。X 对象几乎没有像 String、int 等普通字段,但它也有一个 Y 类型列表。这个 Y 类型也相当复杂。为了让我的问题变得更加困难,假设类型 Y 有另一个类型 Z 的列表。

理想情况下,我需要模拟对象 X,但告诉它在内部注入(inject)另一个 Y 类型的模拟,这也应该向自身(Y)注入(inject)另一个模拟 Z。我该怎么做?

如果我有这么多的少级模拟,我应该如何避免编写这些模拟在调用其方法时实际应返回的内容的 20 个规范?

或者这是一种我应该使用构建器并实际构建真实对象的问题?

非常感谢,鲍勃。

编辑:只是我脑海中的一个示例使用代码:

public String produceImportantStringOfImportantData(ObjectX x) throws ParseException {
StringBuilder textResult = new StringBuilder();

List<ObjectY> listOfY = x.getListOfY();

if (listOfY.isValid()) {
for (ObjectY y : listOfY) {
for (ObjectZ z : y.getListOfZ()) {
textResult.append("<font color='green'>").append(z.getField2).append("</font>").append(": ").append(z.getSomething())
.append(" Label : ").append(z.getParentComponent.getField()))
.append(" some important labels: ").append(z.getField()))
.append(" some important labels ").append(y.getAnotherField))
.append(" different, important label: ").append(y.getField()))
.append("<br/>");
}
}
}
return textResult.toString();
}

最佳答案

假设您正在使用一些模拟框架,例如 Mockito ,你可以简单地这样做:

X mockX = Mockito.mock(X.class);
Y mockX = Mockito.mock(Y.class);
Z mockX = Mockito.mock(Z.class);
Mockito.when(mockY.getZ()).thenReturn(mockZ);
Mockito.when(mockX.getY()).thenReturn(mockY);

如果这变得太深(您提到了 20 个规范),则可能表明您违反了 Law of DemeterSingle Responsibility Principle 。在这种情况下,这意味着您的类本身执行了太多逻辑,而不是在其构造函数中接受一些执行实际工作的处理器。

如果您愿意这样做,您可以轻松地单独测试处理器,并测试整个过程。

关于java - 使用内部有模拟的模拟进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42859892/

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