Я работаю над проектом, в котором есть несколько модулей, а управление зависимостями осуществляется с помощью инжектора 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;
}
}
Но этот пример не работает, и я не уверен, нарушаю ли я правило проектирования, пытаясь использовать внедренные переменные, такие как глобальные переменные, и есть ли какие-либо недостатки в этом (во время модульного тестирования, так что это контролируемый, моделируемая среда).
Итак, мои вопросы:
- есть ли такая концепция в гуаве для достижения этой цели (т.е. есть ли способ, которым я временно перезаписываю упомянутый объект)
- это хорошая практика? (или если нет, то что?)