0

我的课:

public class Util {
    private static final CustomLogger LOGGER = new CustomLogger(Util.class);

    public static void commitToDB() {
        try {
            CommitToDB();
        } catch (SQLException sqlException) {
             LOGGER.error("Exception in DB Commit", sqlException.getMessage(), sqlException);
        }
    }
}

我的单元测试用例类:

@RunWith(PowerMockRunner.class)
@PrepareForTest({
        CustomLogger.class
})
public class UtilTest {
    @Mock
    private Util util;

    @Mock
    private CustomLogger CustomLogger;

    public void verifyFailedCommitRecords() throws SQLException {
        SQLException sqlException = new SQLException("Exception in DB Commit");
        doThrow(sqlException).when(protectedConn).commit();
        CustomLogger logger = PowerMockito.mock(CustomLogger.class);
        Util.CommitToDB();
        verify(logger, times(1)).error("Exception in DB Commit", sqlException.getMessage(), sqlException);
    }
}

我收到错误消息,指出“实际上,与此模拟的交互为零。” 通缉但未调用:

PS:Util.commitToDB 调用了一个内部类protectedConnection,它抛出了SQLexception。

4

1 回答 1

0

在测试方法中添加以下行可以解决问题:

 Whitebox.setInternalState(Util.class , "LOGGER" , logger);

经过调试,发现 Util 类和 UtilTest 类中的 Logger 实例不一样。

模拟抛出错误“需要但未调用”的原因是因为调用该方法的记录器实例和用于在单元测试中验证的记录器实例不同。

于 2022-01-05T14:08:03.417 回答