当“try”为“Thread.Sleep()”时,如何使用 Mockito 测试 try-catch 中代码的“catch”部分?

问题描述 投票:0回答:1

我正在使用mockito来编写测试,但我真的很苦恼如何测试这段特定的代码:

public void myMethod() {
try {
Thread.sleep(400);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}

很多在线示例都使用强制尝试中的任何内容抛出错误的示例 - 但我看过的所有内容都大喊“不要模拟线程”

有没有办法可以使用

Thread.interrupt()
或类似方法强制中断代码?

我确实开始尝试使用间谍:

Thread threadSpy = spy(new Thread());
threadSpy.interrupt();
assertThatExceptionOfType(RuntimeException.class);

但我可以看到这实际上并没有导致

myMethod
中的线程中断,因此实际上并没有测试那段代码。

java unit-testing testing mockito try-catch
1个回答
0
投票

这是测试

public class AppTest {
    @SneakyThrows
    @Test
    void test() {
        AtomicReference<Throwable> reference = new AtomicReference<>();
        Thread thread = new Thread(() -> {
            try {
                this.myMethod();
            } catch (Throwable t) {
                reference.set(t);
            }
        });

        thread.start();
        thread.interrupt();
        thread.join();
        assertNotNull(reference.get());
    }

    public void myMethod() {
        try {
            Thread.sleep(400);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

确保睡眠值足够大。

© www.soinside.com 2019 - 2024. All rights reserved.