Как можно протестировать метод в JUnit на добавление элемента в список?

126
06 декабря 2019, 13:20
 Метод "готовки" Повара, добавляет новый объект типа "Еда" в общий список
 * @param foodArrayList список еды
 * @param ItemName название блюда
 */
void cook(ArrayList<Food> foodArrayList, String ItemName) {
    Random rand = new Random();
    int r = rand.nextInt(4);
    Taste t = null;
    switch (r)
    {
        case 0: t = Taste.SWEET; break;
        case 1: t = Taste.SOUR; break;
        case 2: t = Taste.SALTY; break;
        case 3: t = Taste.BITTER; break;
    }
    Food f = new Food(t, ItemName);
    foodArrayList.add(foodArrayList.size(), f);
}
Answer 1

Пример

public enum Taste {
    SOUR(0),
    SALTY(1),
    BITTER(2),
    SWEET(3),
    UNKNOW(-1);
    private final int code;
    Taste(int code) {
        this.code = code;
    }
    public static Taste get(int code) {
        for (Taste value : values()) {
            if (value.code == code) {
                return value;
            }
        }
        return UNKNOW;
    }
    public static int size() {
        return values().length;
    }
}
public class Food {
    private final Taste  taste;
    private final String name;
    public Food(Taste t, String itemName) {
        this.taste = t;
        this.name = itemName;
    }
    public Taste getTaste() {
        return taste;
    }
    public String getName() {
        return name;
    }
}
public class A {
    private List<Food> list;
    public boolean addCook(String name) {
        return getList().add(getRandomFood(name));
    }
    protected List<Food> getList() {
        if (list == null) {
            list = new ArrayList<>();
        }
        return list;
    }
    protected Food getRandomFood(String name) {
        return new Food(Taste.get(randomValue()), name);
    }
    protected int randomValue() {
        Random rand = new Random();
        return rand.nextInt(Taste.size());
    }
}

пример теста

@Test
public void testAddCook() {
    /* prepare */
    A testingClass = mock(A.class, withSettings().defaultAnswer(CALLS_REAL_METHODS));
    List<Food> list = spy(ArrayList.class);
    String name = "name";
    Taste bitter = Taste.BITTER;
    Food food = new Food(bitter, name);
    doReturn(list).when(testingClass).getList();
    doReturn(food).when(testingClass).getRandomFood(anyString());
    /* action */
    boolean actual = testingClass.addCook(name);
    /* assert */
    Assert.assertTrue(actual);
    Assert.assertEquals(list.size(), 1);
    Food expected = list.get(0);
    Assert.assertEquals(food, expected);
    Assert.assertEquals(bitter, expected.getTaste());
    Assert.assertEquals(name, expected.getName());
    verify(testingClass).getList();
    verify(list).add(food);
    verify(testingClass).getRandomFood(name);
}
Answer 2

Я бы немного изменил твой код. В частности, вынес бы генерацию случайного вкуса в отдельный (приватный) метод.

public class Cook {
    public void cook(List<Food> foods, String title) {
        Food f = new Food(randomTaste(), title);
        foods.add(foods.size(), f);
    }
    private Taste randomTaste() {
        Random rand = new Random();
        int r = rand.nextInt(4);
        Taste t = null;
        switch (r)
        {
            case 0: t = Taste.SWEET;  break;
            case 1: t = Taste.SOUR;   break;
            case 2: t = Taste.SALTY;  break;
            case 3: t = Taste.BITTER; break;
        }
        return t;
    }
}
public class Food {
    private String title;
    private Taste taste;
    public Food(Taste taste, String title) {
        this.title = title;
        this.taste = taste;
    }
    public String getTitle() { return title; }
    public Taste getTaste()  { return taste; }
    public void setTitle(String title) { this.title = title; }
    public void setTaste(Taste taste)  { this.taste = taste; }
}
public enum Taste {
    SWEET,
    SOUR,
    SALTY,
    BITTER
}

Ну и сам тест

public class CookTest {
    private Cook cook;
    private List<Food> foods;
    @Before
    public void prepareData(){
        cook  = new Cook();
        foods = new ArrayList<>();
        cook.cook(foods, "food_1");
    }
    @Test
    public void foodsListIncreacedSize_test() {
        assertTrue(foods.size() == 1);
    }
    @Test
    public void foodsListContainFoodWithSameTitle_test() {
        assertTrue(foods.get(0).getTitle().equals("food_1"));
    }
    @Test
    public void foodsListContainFoodWithDifferentTaste_test() {
        for (int i=2; i < 11; i++)
            cook.cook(foods, "food_"+i);
        assertTrue(foods.removeIf(food -> food.getTaste()==Taste.BITTER));
        assertTrue(foods.removeIf(food -> food.getTaste()==Taste.SALTY));
        assertTrue(foods.removeIf(food -> food.getTaste()==Taste.SOUR));
        assertTrue(foods.removeIf(food -> food.getTaste()==Taste.SWEET));
    }
}
READ ALSO
Android - Обращение к Menu из другой процедуры

Android - Обращение к Menu из другой процедуры

Помогите советомприложение в ActionBar выводиться иконка с "Блутусом" При запуске приложение проверяет включен ли блютус или нет если включен...

135
Получить файл с удаленного компьютера

Получить файл с удаленного компьютера

Подскажите, пожалуйста, советом

106
Хранилище для графа

Хранилище для графа

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

144
Когда используется iterator не в цикле foreach?

Когда используется iterator не в цикле foreach?

Бывают ли такие случаи, когда нужно прописывать и работать напрямую с итератором а не в foreach?

118