>我有一个抽象类,其中包含具体方法中的逻辑:
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;
由于不允许在已经用 @Mock
注释的字段上使用 @InjectMocks
,如何在抽象类中注入模拟依赖项?
为了回复评论,我最初想在抽象类中测试具体方法的行为,因为此方法在调用实现之前必须做一些工作(使用提供的依赖项(。为了测试这种行为,我要么必须在每个实现中编写测试(可以有很多实现(,要么通过抽象类测试一次。我最终使用了第一个解决方案:创建一个匿名内部类作为抽象类的实现。谢谢。