Как проверить метод?

280
06 февраля 2020, 05:40

Если метод сook в конечном счёте правильно отрабатывает, то он должен что-то вывести. Так вот как в JUnit тесте проверить, что метод cook что добавил ?

public String tasteToString() {
    switch(taste) {
        case SWEET: return "Sweet";
        case SOUR: return "Sour";
        case SALTY: return "Salty";
        case BITTER: return "Bitter";
    }
    return "Tasteless";
public void cook (List<Food> foods, String name, Veget veget) {
    int rand = new Random().nextInt(4);
    Food f = new Food(name);
    switch (rand) {
        case 0: f.setTaste(Taste.SWEET); break;
        case 1: f.setTaste(Taste.SOUR); break;
        case 2: f.setTaste(Taste.SALTY); break;
        case 3: f.setTaste(Taste.BITTER); break;
    }
    f.setVeget(veget);
    foods.add(f);
}
Answer 1

Чтобы можно было протестировать такой метод, надо из него выносить new Random(), иначе тест будет некорректный, например если в одной из веток выполнения у Вас не будет добавления в лист, то вы с только с определенной вероятностью в тесте на это наткнетесь. Это неверно. Такой тест хуже отсутствия теста.

java sandbox

Kitchen.java

import java.util.List;
class Food {
    private Taste taste;
    private Veget veget;
    public Food(String name) {}
    public void setTaste(Taste taste) {
        this.taste = taste;
    }
    public void setVeget(Veget veget) {
        this.veget = veget;
    }
    public Taste getTaste() {
        return taste;
    }
}
enum Veget{
    PEPPER
}
enum Taste {
    SWEET, SOUR, SALTY, BITTER
}
class Kitchen{
    IRandom randomGenerator;
    public Kitchen(IRandom randomGenerator){
        this.randomGenerator = randomGenerator;
    }
    public void cook(List<Food> foods, String name, Veget veget) {
        int rand = randomGenerator.nextInt(4);
        Food f = new Food(name);
        switch (rand) {
            case 0:
                f.setTaste(Taste.SWEET);
                break;
            case 1:
                f.setTaste(Taste.SOUR);
                break;
            case 2:
                f.setTaste(Taste.SALTY);
                break;
            case 3:
                f.setTaste(Taste.BITTER);
                break;
        }
        f.setVeget(veget);
        foods.add(f);
    }
}
interface IRandom {
    int nextInt(int i);
}

KitchenTest.java

import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class KitchenTest {
    @Test
    public void cook() throws Exception {
        IRandom randomMock = new IRandom() {
            @Override
            public int nextInt(int i) {
                return 0;
            }
        };
        List<Food> foods = new ArrayList<Food>();
        Kitchen k = new Kitchen(randomMock);
        k.cook(foods, "a", Veget.PEPPER);
        org.junit.Assert.assertEquals(foods.get(0).getTaste(), Taste.SWEET);
    }
}
READ ALSO
Ожидание результата EditText в цикле for

Ожидание результата EditText в цикле for

Есть ArrayList в котором находятся словаЕсть EditText куда пользователь вписывает это же слово

253
Как сохранить состояние кнопки в RecyclerView, после выхода из Activity?

Как сохранить состояние кнопки в RecyclerView, после выхода из Activity?

Вопрос заключается в следующем : У меня есть список RecyclerView, где возле каждого item есть кнопка(с картинкой)При нажатии на кнопку, изображение...

241
Как console log работает без вызова с параметром?

Как console log работает без вызова с параметром?

Недавно встретил в интернете такой коментарий:

219
Как получить все роли сервера Discord?

Как получить все роли сервера Discord?

Пишу бота для дискордаНужно получить все роли сервера

230