6

我有以下代码:

class Sleeper {
    public void sleep(long duration) {
        try {
            Thread.sleep(duration);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

如果 Thread.sleep() 抛出 InterruptedException,我如何使用 JMockit 测试 Thread.currentThread().interrupt() 被调用?

4

2 回答 2

3

有趣的问题。测试起来有点棘手,因为模拟某些方法java.lang.Thread可能会干扰 JRE 或 JMockit 本身,并且因为 JMockit(当前)无法动态模拟本机方法,例如sleep. 也就是说,它仍然可以做到:

public void testResetInterruptStatusWhenInterrupted() throws Exception
{
    new Expectations() {
       @Mocked({"sleep", "interrupt"}) final Thread unused = null;

       {
           Thread.sleep(anyLong); result = new InterruptedException();
           onInstance(Thread.currentThread()).interrupt();
       }
    };

    new Sleeper.sleep();
}
于 2011-08-21T20:31:57.143 回答
1

从 JMockit 1.43 开始,这是不可能的

JMockit 1.43 添加了这个 commit,它检查你是否试图模拟一个线程并将其列入黑名单。现在你会得到这个异常:

java.lang.IllegalArgumentException:java.lang.Thread 不可模拟

于 2019-03-08T22:03:13.907 回答