我最终只是使用反射在我的基类中设置了一个私有字段,如下所示:
// mock the strategy dependency
Strategy strategyMock = mock( Strategy.class);
when(....).thenReturn(...);
// mock the abstract base class
BaseClass baseMock = mock(BaseClass.class, CALLS_REAL_METHODS);
// get the private streategy field
Field strategyField = baseMock.getClass().getSuperclass().getDeclaredField("_privateStrategy");
// make remove final modifier and make field accessible
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(strategyField, strategyField.getModifiers() & ~Modifier.FINAL);
strategyField.setAccessible(true);
// set the strategy
strategyField.set(baseMock, strategyMock);
// do unit tests with baseMock
...
如果私有字段的名称发生变化,它会中断,但它会被评论,我可以忍受。很简单,它是一行代码,我发现这比公开任何设置器或必须在我的测试中显式地继承子类更可取。
编辑: 所以它不再是一行代码,因为我的私有字段需要是“最终的”,需要一些额外的反射代码才能解决。