2

静的メソッド Thread.sleep(1); をモックしようとしています。呼び出されたときに InterruptedException を返す。私の問題に対処しているように見える SO の質問を見つけましたが、その質問の回答と同じになるようにコードを設定した後も、まだ機能しませんでした。

私が見つけたSOの質問は次のとおりです。Powermockで例外をスローするためにvoid静的メソッドをモックする方法は?

テストしようとしているメソッドのスニペットは次のとおりです。

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

そして、これは私のテストクラスからのスニペットで、 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 がメソッドのその部分のコード カバレッジを示していないため、例外がスローされていないことがわかります。メソッドをデバッグして、キャッチ フレーズがヒットしないことを確認しました。

私の問題を見てくれてありがとう!

4

1 に答える 1

3

答えを読むと、実際には 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() の 2 つの呼び出しを行わない限り、モック化された IOException はスローされません。」と書かれていることに注意してください。その後、「実際には、上記の Adder.add(12) はモック静的メソッドの設定の一部です」。

おそらく、Thread.sleep への最初の「呼び出し」のようなマッチャーを使用anyInt()してから、テストの実行に移る必要があります。

于 2012-12-04T20:41:44.947 に答える