我正在尝试测试 Controller 内的方法,其中一个类在其中创建了对象,如下所示:
NewPaymentModel pModel = new NewPaymentModel();
然后我有 if 语句:
if (pModel.getErrors().isEmpty()) {
这正是我想要 mock 的。我的代码如下:
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。
最佳答案
已经给出直接答案 here 。基本上,您的代码必须满足各种先决条件;例如,您需要使用 @PrepareForTest 注释(这样强大魔法就可以操纵生产类的字节代码)。
真正的答案是:当您编写自己的代码时,只需编写易于测试的代码即可。开始here 。含义:您可以为此类对象依赖注入(inject)工厂,而不是在生产代码中调用 new 。可以用“正常”方式 mock 该工厂。并且您对模拟 new 的需求消失了;您可以摆脱 PowerMock(ito) ...并最终获得更好设计的生产代码!
关于java - 在其他类中模拟创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44819708/