6

私は次のコードを持っています:

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

JMockitを使用して、Thread.sleep()がInterruptedExceptionをスローした場合に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は、このコミットを追加しました。これは、スレッドをモックしようとしているかどうかをチェックし、ブラックリストに登録します。これで、次の例外が発生します。

java.lang.IllegalArgumentException:java.lang.Threadはモック可能ではありません

于 2019-03-08T22:03:13.907 に答える