我希望示例代码片段足以重建我的问题。
我有一个班级TreeWalker
和一个子班级ABCTreeWalker extends TreeWalker
。
我使用Spring依赖注入和TreeWalker
我有一个受保护的依赖项Helper helper;
,因此也可以在ABCTreeWalker
中使用。像helper
这样的所有依赖项都使用Springs @Autowired
进行字段注入,因此没有setter。
public class TreeWalker {
@Autowired
protected Helper helper;
}
public class ABCTreeWalker extends TreeWalker {
@Override
public void doSomething() {
String something = helper.getSomething();
InstanceModel instanceModel = new InstanceModel(something);
// ... more stuff ...
}
}
我需要为ABCTreeWalker
类创建一个单元测试,我需要做两件事:
helper
的模拟注入我的ABCTreeWalker
课程中
测试我的测试使用@RunWith(PowerMockRunner.class)
运行,允许使用helper
和@InjectMocks
注释注入@Mock
。但是:为了准备构造函数mock,我需要准备一个带有注释ABCTreeWalker
的{{1}}下的Class。如果我这样做,注射将不再发生(我猜因为它来自超级类)。
@PrepareForTest(ABCTreeWalker.class)
那我现在该怎么办?
@RunWith(PowerMockRunner.class)
@PrepareForTest(ABCTreeWalker.class)
public class ABCTreeWalkerTest {
@InjectMocks
private ABCTreeWalker abcTreeWalker;
@Mock
private Helper helper;
@Test
public void testVisitGui() throws Exception {
// ... more stuff ...
when(helper.getSomething()).thenReturn("test");
InstanceModel instanceModel = mock(InstanceModel.class);
PowerMockito.whenNew(InstanceModel.class)
.withArguments("test")
.thenReturn(instanceModel);
// ... more stuff ...
abcTreeWalker.doSomething(); // execute
// assertions etc.
}
中注入helper
,但这是多余的你们有建议吗?
答案 0 :(得分:0)
您是否考虑过@Autowired构造函数
public class TreeWalker {
protected Helper helper;
@Autowired
public TreeWalker(Helper helper){
this.helper = helper;
}
} 然后在孩子的构造函数中调用super()?