在可以修改被测类并且需要避免字节码操纵,保持快速运行或最小化第三方依赖性的情况下,这是我使用工厂提取 new
操作。
public class TestedClass {
interface PojoFactory { Pojo getNewPojo(); }
private final PojoFactory factory;
public TestedClass() {
this.factory = new PojoFactory() {
@Override
public Pojo getNewPojo() {
return new Pojo();
}
};
}
public TestedClass(PojoFactory factory) {
this.factory = factory;
}
public void doSomething() {
Pojo pojo = this.factory.getNewPojo();
anythingCouldHappen(pojo);
}
}
有了这个,您就可以轻松地测试,声明和验证Pojo对象上的调用:
public void testSomething() {
Pojo testPojo = new Pojo();
TestedClass target = new TestedClass(new TestedClass.PojoFactory() {
@Override
public Pojo getNewPojo() {
return testPojo;
}
});
target.doSomething();
assertThat(testPojo.isLifeStillBeautiful(), is(true));
}
如果TestClass
具有多个构造函数,而这些构造函数必须使用多余的参数进行复制,则这种方法的唯一缺点可能是出现。
由于SOLID原因,您可能希望将PojoFactory接口改为Pojo类,以及生产工厂。
public class Pojo {
interface PojoFactory { Pojo getNewPojo(); }
public static final PojoFactory productionFactory =
new PojoFactory() {
@Override
public Pojo getNewPojo() {
return new Pojo();
}
};