Test błędu metody close()

0

Chciałbym napisać test który wyrzuca wyjątek przy wywoływaniu metody close().

Generalnie próbuję napisać poprawnie metodę.

public static <T extends AutoCloseable> void closeAll(ArrayList<T> elems) {
        for (T elem: elems) elem.close();
}

i obsłużyć błędy przy zamykaniu, ale nawet nie wiem jak je sprowokować.

0

To podczas testów zamokuj sobie ten swój element i ustaw że na wywołaniu metody close() ma rzucić dany wyjątek

0

No dobra, ale właściwie co powoduje ten wyjątek? Np dla BufferReader?

public void close() throws IOException {
        synchronized (lock) {
            if (in == null)
                return;
            try {
                in.close();
            } finally {
                in = null;
                cb = null;
            }
        }
    }
0

Sporo rzeczy może powodować wyjątek XD Ty się pytałeś tylko, jak przetestować poprawne łapanie wyjątku.

1

Testując swoją metodę nie będziesz przecież zaglądał do każdej implementacji AutoClosable i sprawdzał wszystkich możliwych powodów błędów. closeAll powinna minimum przechwycić i zalogować wyjątek, ale kontynuować petlę. Ewentualnie w przypdaku niektórych wyjątków spróbować naprawić stan i ponowić zamykanie (ale to raczej nie zbyt dobre podejście)

Przykładowy test

@Test
    public void closeAll_exceptionThrownByClose_shouldContinueClosing() throws Exception {
        //given
        List<AutoCloseable> resources = Arrays.asList(mock(AutoCloseable.class),
                mock(AutoCloseable.class),
                mock(AutoCloseable.class)
        );

        when(resources.get(1)).thenThrow(new Exception());

        //when
        Utils.closeAll(resources);

        //then
        verify(resources.get(0), atLeastOnce()).close();
        verify(resources.get(1), atLeastOnce()).close();
        verify(resources.get(2), atLeastOnce()).close();
    }

PS: closeAll powinna raczej przyjmować List<T> zamiast ArrayList<T>.

0

Dzięki 100. Wiele mnie nauczyłeś. Byłbyś uprzejmy napisać tę metodę z obsługą błędów?

1 użytkowników online, w tym zalogowanych: 0, gości: 1