Как смоделировать Thread.sleep () с помощью JMockit? - PullRequest
5 голосов
/ 17 августа 2011

У меня есть следующий код:

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

Как проверить, с помощью JMockit, что Thread.currentThread (). Interrupt () вызывается, если Thread.sleep () генерирует исключение InterruptedException?

Ответы [ 2 ]

3 голосов
/ 22 августа 2011

Интересный вопрос. Немного сложно протестировать, потому что подделка определенных методов 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();
}
0 голосов
/ 09 марта 2019

Начиная с JMockit 1.43 это невозможно

JMockit 1.43 добавил этот коммит , который проверяет, пытаетесь ли вы смоделировать поток, и помещает его в черный список. Теперь вы получите это исключение:

java.lang.IllegalArgumentException: java.lang.Thread не является поддельным

...