如何使用Mockito对图节点进行单元测试?

超级法官

考虑以下类别:

public class Node {
    private final Collection<Node> mDependants = new ArrayList<>();
    private Node mDependency;

    public void initialize(final Node node) {
        // complex code that might call registerDependency;
    }

    private void registerDependency(final Node node) {
        mDependency = node;
        node.registerDependent(this);
    }

    private void registerDependent(final Node node) {
        mDependants.add(node);
    }
}

然后进行如下单元测试:

import static org.mockito.Mockito.mock;

public class NodeTest {
    private Node mTarget;
    private Node mDependent;

    @Before
    public void setUp() {
        mTarget = new Node();
        mDependent = mock(Node.class);
    }

    @Test
    public void test() {
        mTarget.initialize(mDependent);
    }
}

由于registerDependent是私有的,因此mockito实际上不会对其进行模拟。由于mTarget实际上是真实实例,因此当通过initialize执行registerDependency方法时,它将尝试在该模拟上执行私有方法registerDependent。作为模拟的模拟将不会初始化,并且mDependant实际上将为null,从而导致mDependats.add(node)上出现NullPointerException。

什么是正确的测试方法?我应该使用两个真实的Node而不是模拟对象吗?我应该公开这些方法以允许该方法的模拟吗?我还缺少其他选择吗?“最终节点”节点

杰夫·鲍曼

因为这是对Node的测试,所以请尽可能避免对Node进行模拟。它使测试模拟框架正常工作或规范定义正确变得很容易,而不是测试实现是否正确。

我很喜欢JB Nizet在这里的回答:如果您要建造炸弹雷管,那么经常进行的测试应使用真正的雷管和模拟炸弹。模拟应该针对被测系统依赖性协作者,而不是针对被测系统本身。

如果您的Node是一个接口,并且您的NodeImpl实现可以接受任何Node作为从属,那么使用模拟Node可能更有意义-两者都是因为您可以传入带有甚至可能还不存在的不同实现的Nodes,并且当您将自己限制为模拟接口时,许多Mockito的陷阱就会消失。但是,由于Node及其从属节点是相同的具体类,并且依赖于私有实现细节,因此使用实际实例可能会获得更大的成功。

此外,这些节点不太可能涉及繁重的服务层或其他依赖于模拟的依赖项,毫无疑问,该节点的行为是否良好:您可以看到它在相邻的测试中。

(此外:在被测系统中有一些模拟单个方法的技术,即“部分模拟”,但是当您不使用遗留代码或繁重的服务时,也应避免使用这些技术。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Mockito模拟静态方法以进行单元测试

如何/应该使用Mockito对EventBus事件进行单元测试?

使用Mockito进行Runnable的单元测试

使用Mockito进行单元测试LazyLogging

使用Mockito对POJO进行单元测试

如何使用 Mockito 通过单元测试?

如何模拟要使用JUnit + Mockito进行单元测试的服务中使用的类

使用 Mockito 对 Realm 包装的 LiveData 进行单元测试

使用Mockito库进行Scala单元测试

使用Mockito对构造函数进行单元测试

使用 Mockito 对基于 Guice 的类进行单元测试

使用Mockito和Firebase进行单元测试

使用Mockito进行单元测试改造API调用-ArgumentCaptor

如何使用 gorm 进行单元测试

如何使用 spring boot 和 mockito 对控制器方法进行单元测试

Kafka:是否有示例说明如何使用Mockito进行单元测试Kafka?

如何使用Mockito对Flink计时器进行单元测试

在继承的情况下,如何使用Mockito进行单元测试?

在使用Mockito进行单元测试时,如何处理ThirdParty类的静态方法调用?

Android-如何使用Mockito对测井类进行单元测试

节点,使用sinon进行单元测试和模拟

单元测试如何使用Mockito模拟存储库

如何在Python中使用Mockito编写单元测试

如何使用Mockito在单元测试中调用AppCompatActivity onCreate

使用 mockito 创建单元测试

使用Mockito的Spring服务单元测试

如何对使用其他经过单元测试的功能进行单元测试?

使用 redux-mock-store 进行单元测试 - 如何使此单元测试通过?

使用Mockito进行的JVM单元测试,用于测试Retrofit2和RxJava的网络请求