Тестовый случай с использованием Mockito не возвращает ожидаемое строковое значение

#java #junit #mockito

Вопрос:

У меня есть моя настройка здесь @Раньше для моего тестового примера

 r = RentACat.createInstance();
c1 = Mockito.mock(Cat.class);
        Mockito.when(c1.getId()).thenReturn(1);
        Mockito.when(c1.getName()).thenReturn("Jennyanydots");

c2 = Mockito.mock(Cat.class);
        Mockito.when(c2.getId()).thenReturn(2);
        Mockito.when(c2.getName()).thenReturn("Old Deuteronomy");
 

С моим тестовым случаем как

 r.addCat(c1);
        r.addCat(c2);
        r.addCat(c3);
        
        //Execution Steps
        String ret = r.listCats();
        
        //Postconditions
        assertEquals("Return string is not equal to expected string with added cats", "ID 1. JennyanydotsnID 2. Old Deuteronomy", ret);
 

И это моя реализация listCats();

     public String listCats() {
        // TODO
        StringBuilder retBuild = new StringBuilder();
        for(Cat c : cats) {
            if(c.getRented() == false) {
                retBuild.append(c.toString());
                retBuild.append("n");
            }
        }
        return retBuild.toString();
    }
 

Тем не менее, когда я запускаю этот тестовый случай, я получаю возвращаемое значение пустой строки.
Я пробовал некоторые вещи, такие как изменение моей реализации listCats();
, чтобы

     public String listCats() {
        // TODO
        StringBuilder retBuild = new StringBuilder();
        for(Cat c : cats) {
            if(c.getRented() == false) {
                retBuild.append(c.toString());
                retBuild.append("n");
                return retBuild.toString();

            }
        }
        return retBuild.toString();
    }
 

Однако, когда я запускаю это, я получаю только одну из кошек, как и ожидалось, с наблюдаемыми значениями, такими как "Mock for Cat, hashCode: 10523xyz"

Что я делаю не так в своем listCats() методе?

Комментарии:

1. Откуда это cats берется?

2. Тебе тоже нужно издеваться getRented ?

3. if(c.getRented() == false) вырождается. if(!c.getRented())

4. @Егор в чем-то прав. Если это Boolean а, то это может быть null .

5. Обратите внимание, что вы также звоните toString не getName в своем цикле.

Ответ №1:

Да, потому что вам нужно определить toString() поведение также в издевательском объекте. Строка, которую вы видели toString , является версией по умолчанию для издевательского объекта. вы можете определить свой, как показано ниже.

 Mockit.when(c1.toString()).thenReturn("Jennyanydots");
Mockit.when(c2.toString()).thenReturn("Old Deuteronomy");
 

Обратите внимание: если Cat класс-это просто объект POJO с геттером/сеттером, не нужно издеваться над ним, вы просто заполняете все, что хотите, из данных

Комментарии:

1. Спасибо, это то, чего мне не хватало

2. Рад это слышать 🙂