当前位置: 首页 > 知识库问答 >
问题:

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

阎功
2023-03-14

请考虑以下类:

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实际上是一个真实的实例,因此当registerDependency方法通过initialize执行时,它将尝试在模拟上执行私有方法RegisterDependence。作为mock的mock将不会被初始化,mDependants实际上将为null,从而导致mDependats.add(node)上的NullPointerException。

测试这个的正确方法应该是什么?我应该使用两个真实的节点而不是一个模拟节点吗?我是否应该将方法公之于众以允许对方法进行嘲弄?是否还有其他选项我遗漏了?最终节点节点

共有1个答案

姜志
2023-03-14

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

我是JB Nizet的粉丝,他的答案是:如果你正在制造炸弹雷管,你经常的测试应该使用一个真正的雷管和一个模拟炸弹。模拟对象应该是被测试系统的依赖项和协作者,而不是被测试系统本身。

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

此外,这些节点不太可能涉及大量的服务层或其他依赖关系,这些依赖关系本身就容易被嘲弄,而且节点是否表现良好是毫无疑问的:您可以在相邻的测试中看到它。

(旁白:有一些技术可以用来模拟测试中的系统中的单个方法--“部分模拟”--但当您不使用遗留代码或繁重的服务时,也可以避免这些方法。)

 类似资料:
  • 我有DaoImpl类: 我的测试是: 测试是成功的,但是当我运行具有覆盖率的junit测试时,它显示方法没有被覆盖,因此我的整体单元测试行覆盖率低于要求。我们能涵盖那部分吗?如果是,我们怎么做?谢了。

  • 问题内容: 如何在单元测试中测试 hashCode()函数? 问题答案: 每当我覆盖equals和hash代码时,我都会按照Joshua Bloch在“ Effective Java”第3章中的建议编写单元测试。我确保equals和hash代码是自反的,对称的和可传递的。我还确保“不等于”对所有数据成员均正常工作。 当我检查对equals的调用时,我还要确保hashCode的行为符合预期。像这样:

  • 问题内容: 我一直在学习AngularJS,并且在单元测试方面进展非常顺利,但是我遇到了一个棘手的问题。 假设我有一个简单的表格,例如: 如果我正在测试类似控制器的东西,我知道我会这样写(使用Jasmine + Karma): 但是我不知道我需要注入哪些服务,也没有运气在指南或文档中找到有关单元测试的文档。 一个单元如何在Angular中测试表单? 问题答案: 我不认为这是对此类内容进行单元测试的

  • 我正在为我的应用程序创建一个Spring BootAPI。我试图使用mockito对我的服务实现进行单元测试,以模拟出细节。该服务将向数据库添加一个新的构建实体。下面是服务实现和测试实现。楼宇服务: BuildingServiceImpl_UT

  • 本文向大家介绍对Angular.js Controller如何进行单元测试,包括了对Angular.js Controller如何进行单元测试的使用技巧和注意事项,需要的朋友参考一下 一、写个简单的Angular App 在开始写测试之前,我们先写一个简单的计算App,它会计算两个数字之和。 代码如下: 二、简单说说里面涉及的一些基本概念: 创建一个 module 什么是angular.modul

  • 问题内容: 如您所知,异常情况下会引发异常。那么如何模拟这些异常呢?我觉得这是挑战。对于此类代码段: 有人有好主意吗? 问题答案: 其他答案已经解决了如何编写用于检查是否引发异常的单元测试的一般问题。但是我认为您的问题实际上是在询问如何获取代码以首先引发异常。 以您的代码为例。在简单的单元测试的环境中,很难在内部引发异常。问题是,为了使异常发生,代码(通常)需要在网络中断的计算机上运行。安排在单元