在其他类中模拟对象的创建

时间:2017-06-29 08:15:16

标签: java unit-testing mockito powermockito

我试图在我的控制器中测试方法,其中一个类在其中创建了对象,如下所示:

  NewPaymentModel pModel = new NewPaymentModel();

然后我有if声明:

  if (pModel.getErrors().isEmpty()) {

这正是我想要嘲笑的。我的代码如下:

Pr4Error error = Mockito.mock(Pr4Error.class);
List<Pr4Error> listOfErrors = new ArrayList<>();
listOfErrors.add(error);

final NewPaymentModel pModel = 
  PowerMockito.mock(NewPaymentModel.class, Mockito.RETURNS_DEEP_STUBS);

PowerMockito.whenNew(NewPaymentModel.class).withNoArguments().
  thenReturn(pModel);      

Mockito.doReturn(pModel).when(facade).addNewPayment(pModel);
when(pModel.getErrors().isEmpty()).thenReturn(true);

修改即可。 运行单元测试时得到的是最后一行代码的nullpointerexception。

1 个答案:

答案 0 :(得分:1)

已经给出了直接答案here。基本上,您的代码必须符合各种先决条件;例如,您需要使用@PrepareForTest注释(以便 power 魔法可以启动操作生产类的字节代码)。

真正的答案是:当您编写自己的代码时,只需编写易于测试代码即可。开始here。含义:您可以使用例如依赖项为这些对象注入工厂,而不是在生产代码中调用new。那个工厂可以被嘲笑为“正常”的方式。你需要模仿new消失;你可以摆脱PowerMock(ito)......最后得到更好的设计的生产代码!