Как я могу решить это Mockito MissingMethodInvocationException, используя when () ...? - PullRequest
0 голосов
/ 29 апреля 2020

В Eclipse, используя junit и Mockito. Я пытаюсь проверить, что метод возвращает список определенного размера, но получаю следующую ошибку:

org.mockito.exceptions.misusing.MissingMethodInvocationException: when () требует аргумент, который должен быть «вызов метода на макете». Например: when (mock.getArticles ()). ThenReturn (Articles);

Кроме того, эта ошибка может появиться, потому что: 1. Вы заглушаете одно из: final / private / equals () / hashCode () методы. Эти методы не могут быть проверены / проверены. 2. внутри when () вы вызываете метод не в mock, а в другом объекте.

Мой тест:

class ValidateBookResultsTests {

public static ArrayList<Book> searchResults = new ArrayList<Book>();
public static List<Book> topFive;
public static ArrayList<String> authors = new ArrayList<String>();

public static Book book1;
public static Book book2;
public static Book book3;
public static Book book4;
public static Book book5;
public static Book book6;

@BeforeEach
public void setUp() {
    book1 = new Book("title1", authors, "publisher1");
    book2 = new Book("title2", authors, "publisher2");
    book3 = new Book("title3", authors, "publisher3");
    book4 = new Book("title4", authors, "publisher4");
    book5 = new Book("title5", authors, "publisher5");
    book6 = new Book("title6", authors, "publisher6");

    searchResults.add(book1);
    searchResults.add(book2);
    searchResults.add(book3);
    searchResults.add(book4);
    searchResults.add(book5);
    searchResults.add(book6);
}

@Test
public void returnFiveBooksFromSearchResults() {
    authors.add("John Doe");
    authors.add("Bill Gates");

    BookSearch mockBookSearch = Mockito.mock(BookSearch.class);
    Mockito.when(mockBookSearch.returnFiveBooks(searchResults)).thenReturn(topFive);

    System.out.println("return books: " + mockBookSearch.returnFiveBooks(searchResults));
    System.out.println("top: "+ topFive);

    assertEquals(topFive.size(), 5);
 }
}

Мой соответствующий код:

public static List<Book> returnFiveBooks(ArrayList<Book> searchResults) {
  Collections.shuffle(searchResults);
  topFive = searchResults.subList(0, 5);

  printFiveResults();

  return topFive; }

Я читал другие решения, в которых говорится о создании фиктивного класса / объекта, что, как мне кажется, я сделал с помощью "BookSearch mockBookSearch = Mockito.mock (BookSearch.class);"

Что такое Я пропал?

1 Ответ

0 голосов
/ 30 апреля 2020

Сообщение об ошибке говорит о том, что ваш вызов метода не является вызовом метода в макете.

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'.
For example:
    when(mock.getArticles()).thenReturn(articles);

Почему? Потому что вы пытаетесь смоделировать stati c метод.

Mockito.when(mockBookSearch.returnFiveBooks(searchResults)).thenReturn(topFive);

, что эквивалентно:

Mockito.when(BookSearch.returnFiveBooks(searchResults)).thenReturn(topFive);

Mockito нельзя использовать для насмешки stati c методы.

Это объясняет полученную ошибку. Но более фундаментальная проблема с вашим кодом состоит в том, что у вас есть тестируемый метод, и вы смоделируете его в тесте. Это не имеет никакого смысла. Вы должны высмеивать коллабораторов, используемых вашим методом (в вашем коде их нет). Для проверки returnFiveBooks вам вообще не нужны макеты:

@Test
public void returnFiveBooksFromSearchResults() {
    var topFive = BookSearch.returnFiveBooks(searchResults);
    assertEquals(topFive.size(), 5);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...