java - 使用内部类对类进行单元测试的正确方法

标签 java unit-testing junit easymock

A 类有内部类 B。A 类有一个 B 类对象的私有(private)列表,它通过 getBs、addB 和 removeB 方法提供这些对象。如何对 removeB 方法进行单元测试?

我希望创建两个相等的 B 类模拟,添加每个,然后删除其中一个两次(结果是删除两个)。然而,我从失败中了解到 equals 方法不会在模拟对象上调用。

尝试将外部类与其内部类隔离开来进行单元测试是否愚蠢(或不可能)?


示例代码如下

要测试的类:

import java.util.ArrayList;
import java.util.List;

public class Example {
    private List<Inner> inners = new ArrayList<Inner>();

    public List<Inner> getInners() {
        return inners;
    }

    public void addInner(Inner i) {
        inners.add(i);
    }

    public void removeInner(Inner i) {
        inners.remove(i);
    }

    /**
     * equalityField represents all fields that are used for testing equality
     */
    public class Inner {
        private int equalityField;
        private int otherFields;

        public int getEqualityField() {
            return equalityField;
        }

        public Inner(int field) {
            this.equalityField = field;
        }

        @Override
        public boolean equals(Object o) {
            if (o == null)
                return false;
            if (o.getClass() != this.getClass())
                return false;
            Inner other = (Inner) o;
            if (equalityField == other.getEqualityField())
                return true;
            return false;
        }
    }
}

效果不佳的测试用例:

import static org.junit.Assert.*;
import org.junit.Test;
import org.easymock.classextension.EasyMock;

public class ExampleTest {
    @Test
    public void testRemoveInner() {
        Example.Inner[] mockInner = new Example.Inner[2];
        mockInner[0] = EasyMock.createMock(Example.Inner.class);
        mockInner[1] = EasyMock.createMock(Example.Inner.class);        

        Example e = new Example();
        e.addInner(mockInner[0]);
        e.addInner(mockInner[1]);
        e.removeInner(mockInner[0]);
        e.removeInner(mockInner[0]);
        assertEquals(0, e.getInners().size());
    }
}

最佳答案

为什么要 mock 你的内部类?如果我遇到这个问题,我会按原样使用该类并测试外部类的行为是否按预期工作。你不需要模拟内部类来做到这一点。

顺便说一句:当覆盖 equals() 方法时,建议也覆盖 hashCode() 方法。

关于java - 使用内部类对类进行单元测试的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8261035/

相关文章:

java - 强制 Jersey 从 JerseyTest 读取模拟

ssl - SSL 和 StandardPBEStringEncryptor 的 PowerMock 问题

java - 将物体以匀速直线从A点移动到B点

java - 上传 eclipse 项目/库以用作 gradle 依赖项

javascript - 如何解决TypeError : environment. teardown is not a function

unit-testing - 我应该在设置中还是在测试用例中初始化模拟对象?

java - junit中的TestRunner类使用哪种设计模式

java - 如何将具有相同值的多个键插入到 Java 中的 HashMap 中?

Java定时器和绘图动画

python - 基于高级期望行为示例的自动低级测试生成