权力嘲笑当新不起作用时



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

public class IdRunnable{
    public IdRunnable(Node root) {
            this.saHandler = new Handler(root);
    }
    public void call(){
    //Somes codes 
    }
}

我正在使用 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);

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

谢谢。

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

只需做:

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

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

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

  1. Powermock有时会带来丑陋的惊喜(例如测试用例突然失败,出现晦涩难懂的问题;完全不是源于生产代码错误)
  2. 通过学习如何创建可测试的代码,可以轻松避免这种情况。

编辑:鉴于您的评论;您唯一的选择是让PowerMock(ito)为您工作。可能我的这个答案有所帮助。它包含一个用于模拟构造函数调用的小示例;适应您的需求应该没什么大不了的。

相关内容

  • 没有找到相关文章