Мое приложение использует баночку третьей стороны (нет доступа к источнику, и т.д.) У меня есть завод, который создает объект (назовем его Foo
) правильно из настроек, т.е.испытания на заводе класса 3 партии
public FooFactoryImpl implements FooFactory {
private final Settings settings;
private final OtherDependency other;
@Inject
public FooFactoryImpl(Settings settings, OtherDependency other) {
this.settings = settings;
this.other = other;
}
public Foo create(String theirArg) {
Foo newFoo = new Foo(theirArg); // there is no no-arg constructor
// This isn't exactly the way I do it but this is shorter and close enough
newFoo.setParamOne(settings.get("ParamOne"));
newFoo.setParamTwo(settings.get("ParamTwo"));
// etc.
}
}
Я бы хотел, чтобы блок протестировал эту фабрику с помощью Mockito - убедитесь, что созданный объект настроен правильно. Но, конечно, я столкнулся с this problem; то есть, потому что мой завод называет new
, я не могу ввести шпион.
Одним из возможных решений является ввести что-то вроде:
public FooFactoryDumb implements FooFactory {
public Foo create(String theirArg) {
return new Foo(theirArg);
}
}
А потом что-то вроде:
public FooFactoryImpl implements FooFactory {
@Inject @Dumb private FooFactory inner;
// snip, see above
public create(String theirArg) {
Foo newFoo = inner.create(theirArg);
// etc.
}
}
Это, кажется, как много шаблонного кода просто чтобы дать возможность модульного тестирования. Это smells bad для меня, но я могу ошибаться. Есть ли способ лучше?
Это определенно проще. Наверное, у меня слишком много инъекций в зависимости от мозга :) Собираюсь посмотреть, есть ли другие хорошие ответы, прежде чем я соглашусь. – durron597
Я сделал это, и это сработало. И мне не нужно было менять свой модуль или создавать аннотации. – durron597
Это вполне разумная идея, если рефакторинг фабрики является опцией. Однако вам не нужен класс Test Double; вы можете просто использовать шпиона Mockito в 'FooFactoryImpl' и переопределить метод create. Это должно сделать ваши намерения более четкими в вашем тестовом коде. –