Временное изменение объекта, который вводится в несколько классов с помощью Java Guava Injector - PullRequest
0 голосов
/ 01 апреля 2019

Я работаю над проектом, в котором есть несколько модулей, а управление зависимостями осуществляется с помощью инжектора 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;
    }
}

Но этот пример не работает, и я не уверен, нарушаю ли я правило проектирования, пытаясь использовать внедренные переменные, такие как глобальные переменные, и есть ли какие-либо недостатки в этом (во время модульного тестирования, так что это контролируемый, моделируемая среда).

Итак, мои вопросы:

  • есть ли такая концепция в гуаве для достижения этой цели (т.е. есть ли способ, которым я временно перезаписываю упомянутый объект)
  • это хорошая практика? (или если нет, то что?)
...