NPE при издевательстве Метод аннотации - PullRequest
0 голосов
/ 02 мая 2018

Задача - вызвать NoSuchMethodException исключение при вызове table.annotationType().getMethod("name").

У меня есть следующий код

@Mock(answer = RETURNS_DEEP_STUBS)
private Table table;

@Test(expectedExceptions = NoSuchMethodException.class)
public void testGetSupportClassesDatabaseThrowException() throws NoSuchMethodException {
    String testPackageName = "com.usc.dbd.util.supporttable";

    MockitoAnnotations.initMocks(this);

    when(table.annotationType().getMethod("name")).thenThrow(NoSuchMethodException.class);

    SupportTables.getSupportClasses(testPackageName);
}

Тест не пройден с NullPointerException в строке when....

testCompile("org.mockito:mockito-core:2.7.17")

Table является аннотацией от javax.persistence

Возможно, проблема в насмешливом Table интерфейсе.

Я ищу решение, как проверить такой случай.

1 Ответ

0 голосов
/ 02 мая 2018

Две вещи здесь:

  • NPE странно (посмотрим, смогу ли я найти объяснение позже)
  • даже без NPE, ваш тест не имеет смысла

Видите ли, вы создаете один макетный экземпляр класса Table. Вы настраиваете реагировать на определенный вызов с исключением.

Затем вы вызываете статический метод , без использования этого объекта. Это просто ничего не сделает.

Что позже, статический вызов не знает ничего о вашем экземпляре макетированной таблицы. Вы, вероятно, предполагаете, что ваша фиктивная установка повлияет на любой объект таблицы. Нет, не будет! Он влияет только на вызовы, которые происходят с этим конкретным объектом.

Если вы хотите управлять любым произвольным экземпляром Table, созданным где угодно, у вас есть куда больше дел (например, вам придется изучить использование PowerMock или JMockit для перехвата / управления вызовами конструктора) .

Короче говоря: как написано прямо сейчас, ваш тестовый пример не выполняет то, для чего вы его написали.

...