所以我有一个要测试的类,它有一个构造函数 -
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是一件好事。因为现在您可以使用一个构造函数来注入需要模拟的对象。
因为这意味着您更喜欢编写可测试的代码。根据我的经验:
- Powermock有时会带来丑陋的惊喜(例如测试用例突然失败,出现晦涩难懂的问题;完全不是源于生产代码错误)
- 通过学习如何创建可测试的代码,可以轻松避免这种情况。
编辑:鉴于您的评论;您唯一的选择是让PowerMock(ito)为您工作。可能我的这个答案有所帮助。它包含一个用于模拟构造函数调用的小示例;适应您的需求应该没什么大不了的。