我的类:
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);
}
}
我在说";实际上,这个mock没有任何交互"通缉但未调用:
PS:Util.commitToDB调用一个抛出SQLexception的内部类protectedConnection。
在测试方法中添加以下行可以解决问题:
Whitebox.setInternalState(Util.class , "LOGGER" , logger);
调试后,Util类和UtilTest类中的Logger实例似乎不同。
mock抛出错误的原因是";通缉但未被调用";是因为调用该方法的记录器实例和用于在单元测试中验证的记录器实例不同。