代码之家  ›  专栏  ›  技术社区  ›  bmargulies

如何对与thread.interrupt一起工作的代码进行可重复的单元测试?

  •  1
  • bmargulies  · 技术社区  · 15 年前

    考虑一些调用的代码,比如,

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

    并希望处理CloseDBYinTerruptException情况。如何进行一个实际的、可重复的单元测试让我感到困惑。

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

    现在,我已经得到了thread.currentThread().中断正在测试的代码(按照单元测试的要求),但这与实际的异步中断并不是完全相同的事情,是吗?

    1 回复  |  直到 15 年前
        1
  •  3
  •   Rich Seller    15 年前

    您对测试感兴趣的是异常的处理,而不是创建它的细节。您可以将相关代码移动到另一个方法中,然后重写该方法进行测试,并抛出相关的异常。然后,您就可以在不担心线程问题的情况下测试结果了。

    例如:

    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(...);
                }
            };
    
            ...
        }
    }