У меня есть тест JUnit, где я тестирую метод с нулевыми аргументами. Если аргумент/аргументы равны нулю, я бы выбрал исключение NullPointerException. Этот метод сам по себе просто вызовет исключение IOException. Я использую doThrow на mock-объекте класса, но мне кажется, что я теряю исключение в конструкторе doThrow(), и я не могу его поймать. Кроме того, я строго не хочу использовать try catch в своих модульных тестах. Поэтому я использую @Rules для этого. Вот фрагмент кода:
public class TableTest {
@Rule
public ExpectedException exception = ExpectedException.none();
private static Table spyTable;
@Test
public void testCreateTableWithNullTableName_throwsIOEXception() throws IOException {
final String tableName = null;
mockConfig = mock(Configuration.class);
spyPersonTable = spy(new PersonTable());
doThrow(new IllegalArgumentException()).when(spyPersonTable).createTable(tableName, mockConfig);
// exception.expect(IllegalArgumentException.class);
}
Использование объекта исключения @rule. Если я использую прокомментированную строку, чтобы поймать мое исключение, исключение, созданное в конструкции doThrow(), будет потеряно, и я не могу его поймать. Мой unit тест завершится неудачей и жалуется, что:
Expected test to throw an instance of java.lang.IllegalArgumentException
Тест работает нормально, если я прокомментирую эту строку, поскольку у меня есть это. Вот как выглядит мой метод, который я пытаюсь проверить:
public void createTable(final String tableName, final Configuration config) throws IOException
Метод должен вызывать IOException, поскольку конкретное исключение, созданное при создании таблицы, является подклассом IOException.
Является ли мой выбор исключения в JUnit-тест неправильным для этого типа исключения проверки.
Кажется, вы хотите проверить, генерирует ли этот метод исключение; но с помощью doThrow().when(sut).createTable(...)
вы предотвращаете нормальное поведение SUT.
Просто делать:
final PersonTable table = new PersonTable();
table.createTable(null, null); // theoretically throws IllegalArgumentException
И просто проверьте, есть ли исключение. Не знаю, как вы это делаете с вашим @Rule
но я не использую это и здесь, как бы это сделать:
final PersonTable table = new PersonTable();
try {
table.createTable(null, null);
fail("No exception thrown!");
} catch (IllegalArgumentException e) {
assertEquals(e.getMessage(), "the expected message");
}
Ваша проблема в том, что ваш тест на самом деле не вызывает createTable
, и поэтому нечего бросать исключение. Вы могли бы написать это.
@Test
public void testCreateTableWithNullTableName_throwsIOEXception() throws IOException {
final String tableName = null;
mockConfig = mock(Configuration.class);
spyPersonTable = spy(new PersonTable());
doThrow(new IllegalArgumentException()).when(spyPersonTable).createTable(tableName, mockConfig);
exception.expect(IllegalArgumentException.class);
spyPersonTable.createTable(tableName, mockConfig);
}
Но я действительно не вижу смысла делать это, потому что вы действительно просто тестируете Mockito. Вы удаляете метод таким образом, чтобы он ничего не делал, кроме как бросать IllegalArgumentException
, а затем проверял, что ваш stubbing работал нормально - что кажется мне бессмысленным.
IllegalArgumentException
является непроверенным исключением