InvalidUseOfMatchersException при использовании mockito для принудительного вызова исключения CloneNotSupportedException в методе Copy (), который тестируется на junit - PullRequest
3 голосов
/ 18 июня 2019

Я пытаюсь получить доступ к части метода копирования, защищенной попыткой перехвата, используя mockito, пытаясь получить 100% охват в моих тестах junit. Класс, который содержит метод, к которому я хочу получить доступ, реализует cloneable, что затрудняет генерирование ClassNotFoundExceptions.

Я пытался форсировать это исключение несколькими различными способами, используя способность mockito генерировать исключения при вызове метода, но всегда придумывал исключение InvalidUseOfMatchersException.

Ниже приведен код, к которому я должен получить доступ, и моя лучшая попытка его достичь, соответственно

catch(ClassNotFoundException cnfe) {
            cnfe.printStackTrace();
}
MyClass dict = mock(MyClass.class);
Object obj1 = new Object();

when(MyClass.copy(anyObject())).thenThrow(ClassNotFoundException.class);
dict.copy(obj1);

Я ожидаю, что достигну строки cnfe.printStackTrace (), но не смогу.

1 Ответ

1 голос
/ 18 июня 2019

Вы, кажется, издеваетесь над статическим методом, который на самом деле невозможен . Согласно @Matthias, это потребует изменения байтового кода класса во время выполнения .

Вы должны всегда вызывать when с вызовом метода экземпляра, потому что:

  1. Это гарантирует, что метод будет вызываться в макете, а , а не в исходном классе (т. Е. MyClass).
  2. Это предотвращает ошибки во время компиляции, поскольку на такие нестатические методы нельзя ссылаться из статического контекста.

Вот полный код Java:

try {
    MyClass dict = mock(MyClass.class);
    Object obj1 = new Object();

    when(dict.copy(anyObject())).thenThrow(ClassNotFoundException.class);
    dict.copy(obj1);
} catch (ClassNotFoundException ex) {
    ex.printStackTrace();
}

Это должно вывести:

Исключение в потоке "main" java.lang.ClassNotFoundException

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...