【发布时间】:2015-12-07 12:17:05
【问题描述】:
我希望示例代码 sn-ps 足以重建我的问题。
我有一个类TreeWalker 和一个子类ABCTreeWalker extends TreeWalker。
我使用 Spring 依赖注入,在 @987654323@ 中我有一个依赖 Helper helper;,它受到保护,因此在 ABCTreeWalker 中也可用。像 helper 这样的所有依赖项都使用 Springs @Autowired 进行字段注入,因此没有设置器。
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) 运行,它允许使用@InjectMocks 和@Mock 注释注入helper。但是:为了准备构造函数模拟,我需要准备被测类 ABCTreeWalker 和注释 @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注入我的ABCTreeWalker,但这是多余的 - 我可能可以创建一个 setter,但这仅用于测试
- 由于构造函数模拟,我无法重新启动 Powermock
你们有什么建议吗?
【问题讨论】:
-
没有@PrepareForTest(ABCTreeWalker.class)你会得到什么
-
然后注入工作,但我不能再模拟构造函数调用了。
标签: java unit-testing junit dependency-injection powermockito