如何为“中断异常”编写单元测试

2022-09-02 11:45:33

在尝试100%的代码覆盖率时,我遇到了一种情况,即我需要对捕获.如何正确地对此进行单元测试?(请用 JUnit 4 语法)InterruptedException

private final LinkedBlockingQueue<ExampleMessage> m_Queue;  

public void addMessage(ExampleMessage hm) {  
    if( hm!=null){
        try {
            m_Queue.put(hm);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

答案 1

在调用之前,请调用 。这将在线程上设置“中断”状态标志。addMessage()Thread.currentThread().interrupt()

如果在 上调用 时设置了中断状态,则将引发 an,即使 不需要等待 (锁未争用)。put()LinkedBlockingQueueInterruptedExceptionput

顺便说一句,一些达到100%覆盖率的努力会适得其反,实际上会降低代码的质量。


答案 2

使用像Easymock这样的模拟库,并注入一个模拟LinkedBlockingQueue

@Test(expected=InterruptedException.class)
public void testInterruptedException() {
    LinkedBlockingQueue queue = EasyMock.createMock(LinkedBlockingQueue.class);
    ExampleMessage message = new ExampleMessage();
    queue.put(message);
    EasyMock.expectLastCall.andThrow(new InterruptedException()); 
    replay(queue);
    someObject.setQueue(queue);
    someObject.addMessage(msg);
}

推荐