Power Mockito WhenNew确实有效

时间:2017-01-10 10:49:30

标签: mocking mockito junit4 powermock powermockito

所以我有一个要测试的类,它有一个构造函数 -

public class IdRunnable{
    public IdRunnable(Node root) {
            this.saHandler = new Handler(root);
    }

    public void call(){
    //Somes codes 
    }
}

我在调用new运算符时使用Powermock框架注入模拟对象。测试类是 -

@RunWith(PowerMockRunner.class)
@PrepareForTest({IdRunnable.class,Handler.class})
public class IdRunnableTest { 
    private IdRunnable runnable;

    @BeforeClass
    public void oneTimeSetUp(){
        Node root = new Node();
        Handler handler = mock(Handler.class);
        whenNew(Handler.class).withArguments(root).thenReturn(handler);
        runnable = new IdRunnable(root);
    }

    @Test(groups = {TestGroup.UNIT_TESTS})
    public void testCall(){
        runnable.call();
    }
}

当我运行测试时,我可以看到,而不是在IdRunnable的构造函数中模拟新语句它继续创建真正的处理程序对象。 不知何故代码 -

whenNew(Handler.class).withArguments(root).thenReturn(handler);

对我不起作用。任何人都可以建议代码有什么问题。

感谢。

1 个答案:

答案 0 :(得分:1)

当然这是可能的;但这种浪费能源。

只是做:

public IdRunnable(Node root) {
   this(new Handler(root);
}

IdRunnable(Handler saHandler) {
   this.saHandler = saHandler;
}

你的“需要”转向PowerMock就消失了。是的,不是需要 PowerMock是一件好事。因为现在您可以使用允许您注入需要模拟的对象的构造函数。

因为这意味着您更喜欢编写可测试的代码。根据我的经验:

  1. Powermock有时会提供丑陋的惊喜(例如测试用例突然出现模糊问题;根本不会产生生产代码错误)
  2. 通过学习如何创建testable代码,可以轻松避免这种情况。
  3. 编辑:给出你的评论;您唯一的选择是让PowerMock(ito)为您服务。我的answer可能有帮助。它包含一个用于模拟构造函数调用的小例子;根据您的需求调整它不应该是一件大事。