【问题标题】:Powermockito won't throw an exception when mocking static void模拟静态 void 时,Powermockito 不会抛出异常
【发布时间】:2012-12-04 20:12:27
【问题描述】:

我正在尝试模拟静态方法 Thread.sleep(1);调用时返回 InterruptedException。我发现了一个似乎可以解决我的问题的 SO question,但是在将我的代码设置为与该问题的答案相同之后,它仍然无法正常工作。

我发现的 SO 问题是:How to mock a void static method to throw exception with Powermock?

这是我正在尝试测试的方法的 sn-p:

try {
    Thread.sleep(1);
} catch (InterruptedException ie) {
    LOGGER.error("failure to sleep thread for 1 millisecond when persisting
        checkpoint. exception is: " + ie.getMessage());
}

这是我的测试类中的一个 sn-p,它显示了我尝试模拟 Thread.sleep(1) 来做我想做的事:

@RunWith(PowerMockRunner.class)
@PrepareForTest(Thread.class)
public class TestCheckpointDaoNoSQL {

        @Test
        public void test() throws InterruptedException {

        PowerMockito.mockStatic(Thread.class);
        PowerMockito.doThrow(new InterruptedException()).when(Thread.class);
        Thread.sleep(1);
        }
}

我还尝试模拟 InterruptedException 来抛出而不是创建一个新异常,但这并没有帮助。我可以看出异常没有被抛出,因为 ECLEMMA 没有显示该部分方法的代码覆盖率,并且我通过该方法进行调试以验证标语永远不会被击中。

感谢您查看我的问题!

【问题讨论】:

  • 您的代码看起来几乎与您发布的链接中问题中的代码完全相同。你有没有尝试过看起来像那个人想出的答案?
  • 它看起来几乎和那个代码一模一样,因为我复制了他们的解决方案。我不确定它是否对我不起作用,因为我做了一些不同/错误的事情,或者它对 Thread.sleep 不起作用。
  • 不要只是复制代码,阅读他们写的内容。我认为你错过了他们解决方案的背景。

标签: java powermock


【解决方案1】:

阅读答案向我表明,您实际上还没有调用 Thread.sleep,而是刚刚完成了模拟的设置:

    @Test
    public void test() throws InterruptedException {

    PowerMockito.mockStatic(Thread.class);
    PowerMockito.doThrow(new InterruptedException()).when(Thread.class);
    Thread.sleep(1); //This is still setting up the mock, not actually invoking the method.
    }

注意上面的内容:“除非我使用相同的参数对 Adder.add() 进行两次调用,否则不会抛出模拟的 IOException。”后来,“实际上上面的 Adder.add(12) 是设置模拟静态方法的一部分”。

您可能应该在对 Thread.sleep 的第一次“调用”中使用像 anyInt() 这样的匹配器,然后继续执行测试。

【讨论】:

  • 我用 anyInt() 进行了尝试,但我没有在我的 sn-p 中包含我的 assert 语句,它确实执行了 Thread.sleep 方法,所以我想我已经完成了所有这些。抱歉,我的原始问题应该更完整!
  • 啊,好吧。认为这是您的测试方法的全部范围。您提到了调试方法。您是否尝试过在被测单元中中断对 Thread.sleep(1) 的调用,并查看在那里执行了什么(是执行实际的 Thread.sleep,还是进入某种 Mockito 架构)?
猜你喜欢
  • 1970-01-01
  • 2013-03-09
  • 2016-02-23
  • 2013-10-04
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 2023-03-25
  • 2018-12-15
相关资源
最近更新 更多