临时修改使用Java Guava Injector注入多个类的对象

时间:2019-04-01 17:00:28

标签: java unit-testing design-patterns guava inject

我正在一个具有多个模块的项目中,依赖关系管理是通过我不太熟悉的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;
    }
}

但是该示例不起作用,并且我不确定是否通过尝试使用注入变量(如全局变量)来违反设计规则,并且这样做是否有任何缺点(在单元测试期间,因此它是受控的,模拟环境)。

所以我的问题是:

  • 番石榴中是否有实现这一目标的概念(即,我是否可以暂时覆盖上述对象)
  • 这是个好习惯吗? (或者如果不是,那是什么?)

0 个答案:

没有答案