我正在一个具有多个模块的项目中,依赖关系管理是通过我不太熟悉的Guava进样器完成的。
对于单元测试,我需要临时重写注入对象的方法(因为我想在另一个对象调用它时模拟它的失败)。
我可能可以通过修改对象来做到这一点,以便可以将其配置为像object.setTemporaryFail(failType)
那样失败。然后,我还必须在对象的方法中添加类似if(failType!=null){failType=null; fail(failType);}
的内容。尽管我尝试了这种方法并且它可以工作,但我认为它不是很干净,但是我不知道最佳实践是什么(尤其是因为我对这种设计模式不太熟悉)。
对我来说似乎不错的选择是创建一个扩展该对象的类并临时替换它,因此原始对象在实现中不需要任何与单元测试/失败相关的代码(对我来说更好的抽象)。具体来说,我可以做这样的事情:
class ObjectThatFails extends object{
FailType failType;
public objectThatFails(FailType failType){
this.failType = failType;
}
@Override
public methodThatShouldFail(...){
fail(failType);
}
}
在进行单元测试的类中,我可以做:
class paranoidUnitTester {
@Inject
object
@Test
testSpecificFailure(){
Object originalObject = object;
object = new ObjectThatFails(new FailType(stuff));
driver.drive(); //calls the object fails and recovers
//now test is complete so we replace the injected object back
object = originalObject;
}
}
但是该示例不起作用,并且我不确定是否通过尝试使用注入变量(如全局变量)来违反设计规则,并且这样做是否有任何缺点(在单元测试期间,因此它是受控的,模拟环境)。
所以我的问题是: