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/