ловить исключение после doThrow JUNIT

1

У меня есть тест 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-тест неправильным для этого типа исключения проверки.

Теги:
junit
exception
mockito
mocking

2 ответа

3

Кажется, вы хотите проверить, генерирует ли этот метод исключение; но с помощью 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");
}
  • 0
    Этот тест по-прежнему не проходит, но я понял идею и могу взять ее отсюда. Я до сих пор не понимаю, что когда я говорю что-то вроде: public void someTestName () выдает IOException {}, но я также выкидываю IllegalArgumentException, если я передаю нулевые аргументы. Должен ли я также выдать это исключение в объявлении testName?
  • 0
    Вам не нужно этого делать, поскольку IllegalArgumentException является непроверенным исключением
Показать ещё 7 комментариев
0

Ваша проблема в том, что ваш тест на самом деле не вызывает 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 работал нормально - что кажется мне бессмысленным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню