使用PowerMock在Java中使用new实现对象实例化不起作用

时间:2018-03-15 03:32:07

标签: java unit-testing junit powermock

我正在尝试用Java测试一个类。 此类的代码:ToBeTested 公共类ToBeTested {     私人合作者合作者;     public ToBeTested(){         System.out.println(" ToBeTested:Constructor");     }     public void start(){         System.out.println(" ToBeTested:Start");         collaborator = new Collaborator();     } } 此类ToBeTested依赖于另一个类Collaborator。 课程代码:合作者 公共类合作者{     合作者(){         System.out.println(" Collaborator:Constructor");     } } 在测试类ToBeTested时,我想要实现Collaborator的实例化。这是我想要嘲笑的依赖,我不想要它的构造函数被调用。 我使用的是Junit(v4.12)和PowerMock(v1.6.1)。 测试类代码:TestToBeTested import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.easymock.annotation.Mock; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import static org.powermock.api.easymock.PowerMock。*; @RunWith(PowerMockRunner.class) @PrepareForTest({ToBeTested.class,Collaborator.class}) 公共类TestToBeTested {     @嘲笑     私人合作者合作者;     private ToBeTested toBeTested;     @之前     public void setUp()throws Exception {         collaborator = createMock(Collaborator.class);         expectNew(collaborator.getClass())andReturn(空)。         toBeTested = new ToBeTested();     }     @测试     public void test(){         replayAll();         toBeTested.start();         verifyAll();     } } 我的理解是,这将模拟或删除Collaborator,不应该调用它的构造函数。但是,当我运行测试时,我注意到Collaborator的原始构造函数被调用。 测试运行输出: ToBeTested:构造函数 ToBeTested:开始 合作者:构造函数 我对Java中的Java和单元测试非常陌生,所以如果我在这里犯了一个非常根本的错误,我会道歉。 在寻找根本原因的过程中,我提到了以下SO问题: PowerMock的expectNew()并没有像预期的那样嘲笑构造函数 PowerMock expectNew如何指定参数的类型 无法使用PowerMock模拟构造函数 https://dzone.com/articles/using-powermock-mock 非常感谢您提前寻求帮助/建议/反馈。

1 个答案:

答案 0 :(得分:0)

可能不起作用的一个可能原因可能是这一行:

expectNew(collaborator.getClass()).andReturn(null);

collaborator是一个模拟实例,这意味着它是" getClass()"方法将返回Collaborator$CGLIBMockedWithPowermock或类似的东西 - 而不是您想要的Collaborator类。因此,您可以通过将该行更改为:

来使其工作
expectNew(Collaborator.class).andReturn(null);