Чтобы проверить, что вызывается printStackTrace
, самый простой способ, который я могу придумать, - это объект spy / mock Exception
.
Используя mockito, вы можете передать имитацию Class
, которая выдает spy Exception
, когда вызывается newInstance
.
Class<?> mockClass = mock(Class.class);
Exception e = Mockito.spy(new Exception());
Mockito.doThrow(e).when(mockClass).newInstance();
context.getObject(mockClass);
Mockito.verify(e).printStackTrace();
Вы также можете сделать что-нибудь с powermock и whenNew
, если вы знаете, куда Exception
будет брошен (чтобы вы могли @PrepareForTest
этот класс).
Exception e = Mockito.spy(new Exception());
PowerMockito.whenNew(Exception.class).thenReturn(e);
context.getObject(SomeService.class);
Mockito.verify(e).printStackTrace();
Примечание: я не компилировал и не тестировал ни одно из вышеперечисленных (и постоянно получаю неправильные имена классов Mockito
и PowerMockito
по-разному).
Если вы настроены делать это без библиотеки, вы можете сделать что-то вроде:
- Создайте собственный тип
Exception
, который явно устанавливает некоторый флаг при вызове этого метода: - Создайте собственный
class
, который выдает указанное выше Exception
при вызове конструктора без аргументов. - Передайте
.class
этого пользовательский класс в свой метод и убедитесь, что флаг установлен.
Что-то вроде:
class MyException extends Exception {
public static boolean printStackTraceCalled = false;
@Override
public void printStackTrace() {
MyException.printStackTraceCalled = true;
super.printStackTrace();
}
}
class MyClass {
MyClass() {
throw new MyException();
}
}
@Test
void testThing() {
context.getObject(MyClass.class);
Assertions.assertTrue(MyException.printStackTraceCalled);
}
Тем не менее, это просто как вы бы это сделали ... Я не говорю, что это хорошая идея. Это плохой способ справиться с Exception
s, и нацеливание на конкретное c% покрытие кода чаще всего бессмысленно.