java - 在其他类中模拟创建对象

标签 java unit-testing mockito powermockito

我正在尝试测试 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/

相关文章:

java - 单元和集成测试的 Jacoco 覆盖率结合覆盖率

java - Mockito 不 mock

java - Mockito,@InjectMocks 最终字段的奇怪行为

java - AspectJ 找不到 .raw 父类(super class)

java - 获取异常 : IOException input buffer is closed exception while extracting a tar file

java - 重写对象类的compareTo方法

android - Robotium中@Smoke的意义是什么?应该什么时候使用?

java - 如何在 CertPath 验证中使用 OCSP 响应

java - 具有 stomp 安全性的 Spring websocket - 每个用户都可以订阅任何其他用户队列?

visual-studio - Visual Studio 2017 实时测试排除项