I have the following method which works fine. I am trying to test the scenario where an InterruptedException is thrown. This is how I am testing currently which works if I only run this single test. But if I were to run all remaining 5 tests in my test class, some starts failing. All tests passes when I run them individually thus clearly my Thread interrupt in the test is affecting other tests. How can I write my test in a way it won't affect other tests?
@Component
class A{
    @Autowired
    private Helper helper;
    private static ExecutorService executor = Executors.newFixedThreadPool(10);
    // static variable in class
    private final Future<String> number = executor.submit(() -> helper.method());
    //method to be tested 
    public String getNumber() {
        try {
            return this.number.get();
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            throw new CustomException1();
        } catch (ExecutionException e) {
            throw new CustomException2();
        }
    }
}
@RunWith(MockitoJUnitRunner.class)
clas ATest{
    @InjectMocks
    private A a;
    @Mock
    private Helper helper;
    // this is my test method which passes when ran individually. But will affect other tests if everything is ran same time. 
    @Test
    public void testMethod() {
        when(helper.method()).thenReturn("222");
        String num = a.getNumber();
        // doing this on purpose so I would land inside the catch. This line is causing issues.
        Thread.currentThread().interrupt();
        try {
            assertEquals("222", num);
        }catch (CustomException1 e){
            // I will land here for this test as expected
            // do some assertions
        }
        // Thread.currentThread().interrupt(); // Tried calling it again here to clear the flag but doesn't work. 
    }
    // another few tests ..... 
}
                I think the best way to do that is to Mock the interrupted exception
when(helper.method())).thenThrow(InterruptedException.class);
But you can also just clear the interruption flag by calling the method:
Thread.interrupted()
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With