У меня есть тип перечисления, который я использовал как набор фабрик для других объектов, которые реализуют общий интерфейс. упрощенная версия кода:
interface Operation {
void execute();
}
enum Factory {
TYPE1(Class1::new),
TYPE2(Class2::new);
private Supplier<Operation> constructor;
Factory(Supplier<Operation> constructor) {
this.constructor = constructor;
}
Operation build() {
return constructor.get();
}
}
A упрощенная версия клиентского кода выглядит так:
class Client {
private void run(EnumSet<Factory> required) {
for (Factory x : required) {
x.build().execute();
}
}
// Some code that calls run() with the right EnumSet
}
Похоже, все это работает, как и ожидалось, поэтому я хочу написать несколько юнит-тестов.
Тестировать Factory
легко, но Client
оказывается сложнее. Проблема в том, что я не хочу начинать звонить на Operation
(они много работают). Вместо этого я бы хотел, чтобы x.build()
вернул фиктивный объект.
Я пытался использовать PowerMocks whenNew
, чтобы перехватить создание объектов Operation
, но это не работает (у меня фактически нет никаких «новых» операций). Я также пытался использовать Powermock «шпион», но это не удалось, потому что константы перечисления являются реальными объектами.
Есть идеи?