使用PowerMockito进行模拟构造函数和超级注入的字段

时间:2015-12-07 12:17:05

标签: java unit-testing junit dependency-injection powermockito

我希望示例代码片段足以重建我的问题。

我有一个班级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,但这是多余的
  • 我可能会创建一个setter,但这只适用于测试
  • 由于构造函数模拟
  • ,我无法理解Powermock

你们有建议吗?

1 个答案:

答案 0 :(得分:0)

您是否考虑过@Autowired构造函数

public class TreeWalker {
protected Helper helper;

@Autowired
public TreeWalker(Helper helper){
    this.helper = helper;
}

} 然后在孩子的构造函数中调用super()?