【发布时间】:2012-01-05 20:34:46
【问题描述】:
A 类有内部类 B。A 类有一个 B 类对象的私有列表,它通过 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());
}
}
【问题讨论】:
-
完全不相关,如果不需要外部类的引用,请使用静态内部类
标签: java unit-testing junit easymock