繁体   English   中英

Powermockito / Java-监视类以验证私有方法调用

[英]Powermockito/Java - Spying class under test to verify private method call

我正在使用Mockito / PowerMockito在Java中编写单元测试,但是在我正在进行的测试中,我无法摆脱这个UnfinishedStubbingException。

我要测试的方法是私有的,因此我使用WhiteBoxImpl调用该方法。 在我调用的方法内部,可能会调用被测类中的另一个私有方法(称为pm2)。 我想验证从未调用过pm2,所以我对被测类进行了监视,并验证pm2是否从未调用过。

到目前为止,该测试始终会引发UnfinishedStubbingException,但我无法弄清楚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
    }
}

当我运行此测试时,我收到UnfinishedStubbingException。 堆栈跟踪顶部的行是:

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

但是我似乎无法弄清楚它们中的任何一个如何适用于我的情况。 有谁知道幕后发生的事情导致此错误?

谢谢

问题线是

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

您似乎没有thenthenReturnthenThrow到这里。 您始终需要在when使用其中之一。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM