Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to write unit test for "InterruptedException"

In attempts of 100% code coverage, I came across a situation where I need to unit test block of code that catches an InterruptedException. How does one correctly unit test this? (JUnit 4 syntax please)

private final LinkedBlockingQueue<ExampleMessage> m_Queue;  

public void addMessage(ExampleMessage hm) {  
    if( hm!=null){
        try {
            m_Queue.put(hm);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
like image 955
HipsterZipster Avatar asked Sep 13 '10 22:09

HipsterZipster


2 Answers

Right before invoking addMessage(), call Thread.currentThread().interrupt(). This will set the "interrupt" status flag on the thread.

If the interrupted status is set when the call to put() is made on a LinkedBlockingQueue, an InterruptedException will be raised, even if no waiting is required for the put (the lock is un-contended).

By the way, some efforts to reach 100% coverage are counter-productive and can actually degrade the quality of code.

like image 132
erickson Avatar answered Sep 19 '22 11:09

erickson


Use a mocking library like Easymock and inject a mock LinkedBlockingQueue

i.e.

@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);
}
like image 40
Peter Tillemans Avatar answered Sep 17 '22 11:09

Peter Tillemans