如何使用 mockito/powermockito 模拟内部方法调用

how to mock internal method call using mockito/powermockito

我正在测试 class 中的一个方法,它会调用另一个工件的方法并消耗其中的 return 值。

public void methodToTest()
{
      Object reply = artifactObj.anotherMethod(object);
      if(reply == null)
            return;
      Object =reply.getData();
}

我使用过 powermockito 并且知道如果 "anotherMethod" 存在于同一个 class 中,我可以很容易地监视它。但是我不确定当方法不在同一 class.

中时我该如何做

我的尝试-:

Object mockObject = mock(Object.class);
Object mockReply = mock(Object.class);
Mockito.when(artifactObj.anotherMethod(mockObject)).thenReturn(mockReply);

//Now call original test method 

Class c = new Class(artifactObj);
c.methodToTest(); 

以上操作将始终 return 在我尝试测试的原始方法中回复 = null。我需要回复的一些值 returned 以便我可以在我的方法中使用它。

Null 被 returned 因为永远不会调用模拟方法:

在您的示例中,当您进行模拟时,您将 mockObject 作为匹配器传递,因此当使用相同的方式调用所述方法时,模拟响应仅 returned mockObject 作为参数。你应该做的是引入一个匹配器而不是它。

在下面的示例中使用了 Matchers.any(OriginalArgumentClass.class),它所做的是匹配对使用任何对象作为参数的方法的任何调用,并且return 嘲笑回复。

Object reply = new Object();
ArtifactClass artifactObjMock = Mockito.mock(ArtifactClass.class);
Mockito.when(artifactObjMock.anotherMethod(Matchers.any(OriginalArgumentClass.class))).thenReturn(reply);

现在将 artifactObjMock 传递给构造函数调用:

Class c = new Class(artifactObjMock);
c.methodToTest(); 

假设您在构造函数中将传递的值分配给 artifactObj 字段。