Внедрить макеты в насмешливый абстрактный класс - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть абстрактный класс, который содержит логику в конкретных методах:

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, как я могу внедрить ложные зависимости в мой абстрактный класс?

1 Ответ

0 голосов
/ 25 апреля 2019

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

...