首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用内含mock的mock进行单元测试

使用内含mock的mock进行单元测试
EN

Stack Overflow用户
提问于 2017-03-17 22:17:34
回答 2查看 1.7K关注 0票数 1

我需要对X类型的对象进行单元测试。X对象有几个普通的字段,如String,int等,但它也有一个Y类型的列表。这个Y类型也很复杂。让我的问题更加困难的是,假设类型Y有另一个类型为Z的列表。

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

如果我有这么多的几级mock,我应该如何避免编写20个关于这些mock在调用它们的方法时实际应该返回什么的规范?

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

非常感谢,鲍勃。

编辑:这只是我头顶上的示例用法代码:

代码语言:javascript
运行
复制
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();
}
EN

回答 2

Stack Overflow用户

发布于 2017-03-17 22:31:31

假设你正在使用像Mockito这样的模拟框架,你可以简单地这样做:

代码语言:javascript
运行
复制
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的迹象。在这种情况下,这意味着你的类本身执行了太多的逻辑,而不是在它们的构造函数中接受一些处理器来做实际的工作。

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

票数 7
EN

Stack Overflow用户

发布于 2017-03-17 22:44:59

请不要使用mock,因为绝对没有必要这样做,但您似乎已经意识到,这将导致痛苦和脆弱的测试。

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

你甚至不需要Builder (尽管我推荐他们)--只要使用一个真实的对象即可。使用真实的对象将导致一个测试,它必须更具重构的弹性,将测试您的代码实际在做什么,而不仅仅是您认为它是什么。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42859892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档