У меня есть абстрактный класс, который содержит логику в конкретных методах:
public abstract class AbstractEventHandler implements EventHandler {
private final Dependency dependency;
public AbstractEventHandler(Dependency dependency) {
this.dependency = dependency;
}
@Override
void handleEvent(Event event) {
dependency.doSomeWork();
[...]
doHandleEvent(event);
[...]
}
@Override
void handleOtherEvent(OtherEvent otherEvent) {
dependency.doOtherWork();
[...]
doHandleOtherEvent(event);
[...]
}
protected abstract doHandleEvent(event);
protected abstract doHandleOtherEvent(event);
}
Изученные решения для тестирования моего абстрактного класса:
- создать фиктивную реализацию абстрактного класса (хорошая идея для конструкторов Насмешка над абстрактным классом и внедрение классов с аннотациями Mockito? )
- проверить логику
handleEvent(event)
в конкретных классах, но мне придется дублировать тест в каждом конкретном классе (или один раз, но в каком классе?)
- использовать
PowerMock
...
- используйте
Mockito
для создания экземпляра реализации абстрактного класса и вызова реальных методов для проверки логики в конкретных методах
Я выбрал решение Mockito
, так как оно быстрое и короткое (особенно если абстрактный класс содержит много абстрактных методов).
@ExtendWith(MockitoExtension.class)
class AbstractEventHandlerTests {
@Mock
private Dependency dependency;
@InjectMocks
@Mock(answer = Answers.CALLS_REAL_METHODS)
private AbstractEventHandler abstractEventHandler;
Поскольку @InjectMocks
не разрешено для поля, уже помеченного @Mock
, как я могу внедрить ложные зависимости в мой абстрактный класс?