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

Powermockito/Java-正在测试的用于验证私有方法调用的间谍类

韶云瀚
2023-03-14

我正在使用Mockito/PowerMockito用java编写单元测试,但是在我正在进行的测试中,我无法摆脱这个未完成的stubbing异常。

我试图测试的方法是私有的,所以我使用WhiteBoxImpl来调用该方法。在我调用的方法内部,可能会调用测试类中的另一个私有方法(称为pm2)。我想验证pm2从未被调用,所以我为测试中的类做了一个间谍,并验证pm2从未()被调用。

到目前为止,这个测试总是抛出一个未完成的StubbingException,但是我不知道我的测试Powermockito不喜欢哪一部分。我还有另一个(正在工作的)测试,其操作非常类似,只是我不需要验证pm2之类的方法的行为。因此,在这种情况下,我不需要为被测试的类创建间谍。我相信我的问题在某种程度上与间谍有关,但我不知道有什么方法可以测试我试图测试的东西,没有它。

以下是我现在拥有的:

@Mock(name = "BO")
BO BOMock;
@Mock(name = "DAO")
DAOI DAOMock;

@InjectMocks
ServiceImpl service;

@Test
public void unitTest(){
    MessageObject msg = new MessageObject();
    Record recordMock = mock(Record.class);
    MetaData metaDataMock = mock(MetaData.class);

    doNothing().when(DAOMock).doAction(any(Param1.class), anyInt());
    when(DAOMock.doOtherAction(any(Param1.class), eq(msg.getId()))).thenReturn(recordMock);
    when(BOMock.getMetaData(anyInt(), anyInt()).thenReturn(metaDataMock);

    ServiceImpl spy = PowerMockito.spy(this.service);
    PowerMockito.doReturn(new Long(10)).when(spy, "checkDelay", recordMock, msg, metaDataMock);

    Whitebox.invokeMethod(spy, "process", msg);
    verify(recordMock, never()).getStatus();
}

下面是我正在测试的ServiceImpl类中的方法:

private BO BO = new BO();
private DAOI DAO = new DAO();

private void process(Message msg) {
    try {
        DAO.doAction(new Param1.class, msg.getId());
    } catch(Exception e) {
        logger.error("some message");
        return;
    }

    Record record = null;

    try {

        int intParam1 = msg.getId();
        int intParam2 = msg.getDifferentId();

        MetaData metaData = BO.getMetaData(intParam1, intParam2);

        record = DAO.loadRecord(new Param1(), msg.getId());

        // checkDelay is a private method in ServiceImpl.java
        long delayForMinutes = checkDelay(record, msg, metaData);
        if(delayForMinutes > 0) {
            // Control should reach here
            logger.debug("some message");
            return;
        }

        // Control should not reach here

        if(Record != null && Record.getStatus() != CREATED) {
            logger.debug("some message");
            return;
        }

        // Perform various actions

    } catch(Exception e) {
        // Perform other various actions
    }
}

当我运行这个测试时,我得到一个UnfinishedStubbingExc0019。堆栈跟踪顶部的行是:

DAO.doAction(new Param1.class, msg.getId());

错误消息提供以下提示:

E.g. thenReturn() may be missing.
Examples of correct stubbing:
    when(mock.isOk()).thenReturn(true);
    when(mock.isOk()).thenThrow(exception);
    doThrow(exception).when(mock).someVoidMethod();
Hints:
 1. missing thenReturn()
 2. you are trying to stub a final method, you naughty developer!
 3: you are stubbing the behaviour of another mock inside before 'thenReturn' instruction if completed

但我似乎不知道它们中的任何一个如何适用于我的情况。有人知道幕后发生了什么导致了这个错误吗?

谢谢你

共有1个答案

权弘新
2023-03-14

问题在于

when(DAOMock.doOtherAction(any(Param1.class), eq(msg.getId()))).loadRecord(recordMock);

这里似乎没有然后然后返回然后抛出。当时,您始终需要使用其中一个。

 类似资料:
  • 问题内容: 我有以下课程: 我的意图是验证当我调用doIt()时,将按该顺序调用metodOne(),methodTwo()和methodThree()方法。 我正在使用模拟嘲笑。有谁知道我如何测试这种情况? 问题答案: 不想成为这个人,但是:别测试这个。测试输出,副作用,结果-而不是执行。 如果您确实想确保顺序正确,请将这些方法提取到单独的类中并进行模拟。

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

  • 我有一个类,它有一个私有方法,并在其主体中调用另一个私有方法。所以我想调用第一个私有方法并模拟第二个。以下是一个例子: 和测试等级: 我通过

  • 我需要使用TestNG、Mockito和现在的PowerMockito针对预先存在的代码库编写单元测试,以更轻松地测试私有和静态方法。我目前正试图针对我们正在测试的类中的一个私有void方法编写一个测试,但无法解决这个问题。在普通的PowerMock API中,有一些方法称为“replayAll()”、“verifyAll()”、“expectLastCalled()”、“code>”,它们适用于

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