8

TDD 実践者として、私は自分がコーディングしたものすべてをテストしたいと考えています。

ここ数年、私は多くのマルチスレッド コードをコーディングしてきましたが、テストの一部が非常に面倒でした。

run()ループ中に発生する可能性のある何かをアサートする必要がある場合、次のようなアサーションが発生します。

assertEventually(timeout, assertion)

Mockitoにはこれに対する解決策があることは知っていますが、検証呼び出しのみです。また、 JUnitにはタイムアウト プロパティがあり、テストのハング (または継続) を回避するのに役立つことも知っています。しかし、私が欲しいのは、時間が経つにつれて真実になるかもしれない何かを主張できるものです.

私の質問は、これを提供するライブラリを知っている人はいますか?

これまでの私の解決策は次のとおりです。

private void assertEventually(int timeoutInMilliseconds, Runnable assertion){
    long begin = System.currentTimeMillis();
    long now = begin;
    Throwable lastException = null;
    do{
        try{
            assertion.run();
            return;
        }catch(RuntimeException e){
            lastException = e;
        }catch(AssertionError e){
            lastException = e;
        }
        now = System.currentTimeMillis(); 
    }while((now - begin) < timeoutInMilliseconds);
    throw new RuntimeException(lastException);
}

それを使用すると、次のようになります。

assertEvetuallyTrue(1000, new Runnable() {
        public void run() {
            assertThat(Thread.activeCount()).isEqualTo(before);
        }
    });
4

4 に答える 4