繁体   English   中英

如何对与Thread.interrupt一起使用的代码进行可重复的单元测试?

[英]How to make repeatable unit tests of code that works with Thread.interrupt?

考虑一些代码,例如,

 file = new RandomAccessFile(x, "r");
 file.getChannel().map(....)

并希望处理ClosedByInterruptException情况。 我对如何进行现实的,可重复的单元测试感到困惑。

为了进行测试,我需要以某种方式将该线程与其他线程进行同步,并使另一个线程在正确的时间调用Thread#interrupt。 但是,所有等待的原语都是可中断的,并且可以清除中断。

现在,我正在测试的代码中有Thread.currentThread()。interrupt(根据单元测试的要求),但这与实际的异步中断并不完全相同,不是吗?

您对测试感兴趣的是异常的处理,而不是创建异常的细节。 您可以将相关代码移到另一个方法中,然后重写该方法进行测试并引发相关异常。 这样,您就可以测试结果,而不必担心线程问题。

例如:

public class Foo {
    /**
     * default scope so it is visible to the test
     */
    void doMapping(RandomAccessFile raf) throws ClosedByInterruptException {
        file.getChannel().map(....);
    }

    public void processFile(File x) {
        RandomAccessFile raf = new RandomAccessFile(x, "r");
        doMapping(raf);
    }
...
}

public class FooTest {
    @Test
    void testProcessFile() {     
        Foo foo = new Foo() {
            @Override
            void doMapping(RandomAccessFile raf) throws ClosedByInterruptException {
                throw new ClosedByInterruptException(...);
            }
        };

        ...
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM