我需要对X类型的对象进行单元测试。X对象有几个普通的字段,如String,int等,但它也有一个Y类型的列表。这个Y类型也很复杂。让我的问题更加困难的是,假设类型Y有另一个类型为Z的列表。
理想情况下,我需要模拟对象X,但告诉它在内部注入另一个类型为Y的模拟,这也应该将另一个模拟Z注入到它自身(到Y)。我该怎么做呢?
如果我有这么多的几级mock,我应该如何避免编写20个关于这些mock在调用它们的方法时实际应该返回什么的规范?
或者这是一种问题,我应该使用Builders并实际构建一个真实的对象?
非常感谢,鲍勃。
编辑:这只是我头顶上的示例用法代码:
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();
}
发布于 2017-03-17 22:31:31
假设你正在使用像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 Demeter或Single Responsibility Principle的迹象。在这种情况下,这意味着你的类本身执行了太多的逻辑,而不是在它们的构造函数中接受一些处理器来做实际的工作。
如果您愿意这样做,您可以单独轻松地测试处理器,并测试整个过程。
发布于 2017-03-17 22:44:59
请不要使用mock,因为绝对没有必要这样做,但您似乎已经意识到,这将导致痛苦和脆弱的测试。
,或者这是一种我应该使用生成器并实际构建真实对象的问题吗?
你甚至不需要Builder (尽管我推荐他们)--只要使用一个真实的对象即可。使用真实的对象将导致一个测试,它必须更具重构的弹性,将测试您的代码实际在做什么,而不仅仅是您认为它是什么。
https://stackoverflow.com/questions/42859892
复制相似问题