当前位置: 首页 > 知识库问答 >
问题:

您如何期望和验证使用PowerMockito和TestNG的私有空方法调用?

姜良哲
2023-03-14

我需要使用TestNG、Mockito和现在的PowerMockito针对预先存在的代码库编写单元测试,以更轻松地测试私有和静态方法。我目前正试图针对我们正在测试的类中的一个私有void方法编写一个测试,但无法解决这个问题。在普通的PowerMock API中,有一些方法称为“replayAll()”、“verifyAll()”、“expectLastCalled()”、“code>”,它们适用于大多数用途。我就是找不到好的文档来解释如何用PowerMockito的方式来做。对此的任何解释或见解都将不胜感激。

测试方法:

private void pVMethod(Type param) throws Exception {

    param.setA(StaticClass.methodA().toString());
    param.setB(StaticClass.methodB().toString());

    // getMemo(String label) is in a public class in same package
    param.setC(getMemo("memo.provider"));
    param.setD(getMemo("memo.item"));
        try {
             param.setTimestamp(DataTypeFactory.newInstance().newXMLGregorianCalendar(newjava.util.GregorianCalendar()));
        } catch (SomeException e) {
           ...
          throw new Exception();
    }
}

测试尝试:

@Test(expectedExceptions = Exception.class)
public void pVMethod() throws Exception {
    TestClass testMock = mock(TestClass.class);
    Exception exception = mock(Exception.class);

    // StaticClass staticClassMock = mock(StaticClass.class); ??
    mockStatic(StaticClass.class);

    // when(..) and thenReturn(..) are static imports from PowerMockito library
    when(StaticClass.methodA()).thenReturn("stubStringA");
    when(StaticClass.methodB()).thenReturn("stubStringB");

    doThrow(exception).when(param).setTimestamp(Mockito.any(XMLGregorianCalendar.class));

    // Docs say method name can be inferred via reflection
    Whitebox.invokeMethod(tested, event);

    // this is where things are hairy. testedSpy is defined at the top level
    verifyPrivate(testedSpy).pVMethod(testMock);
}

共有1个答案

秦博延
2023-03-14

好的,答案如下:

在PowerMockito中,如果要验证私有void方法的行为,可以使用verifyPrivate()方法,但必须这样做:

verifyPrivate(tested).invoke("privateMethodName", argument);

请注意调用方法的使用,在OP的最后一行中缺失。

注意:您不必使用doNothing()。when(mock.privateMethod())语句,因为在默认情况下,mock对象中的void方法不会执行任何操作。

此处示例

 类似资料:
  • 我目前在JUnit测试中遇到了障碍,需要一些帮助。所以我用静态方法得到了这个类,它将重构一些对象。为了简化起见,我举了一个小例子。这是我的工厂课程: 这是我的测试类: 基本上,我试图实现的是私有方法check String()应该被抑制(因此不会抛出异常),并且还需要验证方法check String()实际上是在方法factorObject()中调用的。 更新:抑制正常工作,代码如下: ... 但

  • 我试图模拟一个私有方法(executeGetRequest),在我声明要为私有方法返回的模拟的那一行中,私有方法实际上是用null参数执行的,因此抛出了一个NullPointerException。 VlcPlayerMinimal。爪哇: VlcPlayerMinimalTest。爪哇: 堆栈跟踪: 它似乎PowerMockito实际上是调用的方法,我试图在行PowerMockito.do返回(

  • 问题内容: 我正在为类似于以下示例的方法编写JUnit测试用例: 我在测试类中编写了以下测试用例: 现在,我想验证是否调用了Sample Sample类的static methodC()。如何使用PowerMockito 1.6实现?我已经尝试了很多东西,但是似乎对我来说没有用。任何帮助表示赞赏。 问题答案: 就我个人而言,我不得不说PowerMock等是您的代码不错的情况下不应该解决的问题的解决

  • 问题内容: 我正在尝试模拟私有静态方法。见下面的代码 这是我的测试代码 但是我运行的每个瓦片都会出现此异常 我想我在嘲弄东西时做错了什么。有什么想法我该如何解决? 问题答案: 为此,您可以使用和。 此外,您必须在测试类中指定PowerMock运行器,并准备要进行测试的类,如下所示: 希望对您有帮助。

  • 我正在使用Mockito/PowerMockito用java编写单元测试,但是在我正在进行的测试中,我无法摆脱这个未完成的stubbing异常。 我试图测试的方法是私有的,所以我使用WhiteBoxImpl来调用该方法。在我调用的方法内部,可能会调用测试类中的另一个私有方法(称为pm2)。我想验证pm2从未被调用,所以我为测试中的类做了一个间谍,并验证pm2从未()被调用。 到目前为止,这个测试总