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

时间:2015-05-19 19:52:05

标签: java junit mockito powermock

我正在测试一个类中的方法,该方法又调用另一个工件'方法并消耗其中的返回值。

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

我使用过powermockito并且知道如果"另一个方法"在同一个班级里面我可以很容易地发现它。但是当方法不在同一个班级时,我不确定怎么能这样做。

我的尝试 - :

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(); 

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

1 个答案:

答案 0 :(得分:2)

返回

Null ,因为永远不会调用mocked方法:

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

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

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 字段。