Как смоделировать метод списка с помощью Mockito - PullRequest
0 голосов
/ 07 марта 2019

У меня есть класс обслуживания, который вызывает метод Repository и возвращает List.Теперь я хочу издеваться над этим.Мой сценарий модульного тестирования будет выглядеть следующим образом:

  • Добавить несколько фиктивных объектов в хранилище фиктивных
  • Класс обслуживания запросов, который возвращает список фиктивных объектов
  • Размер списка утверждений

Мой класс хранилища:

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;

import java.util.List;

public interface FoodRepository extends CrudRepository<Food, Long> {

    @Query(value = "SELECT * FROM FOOD WHERE FRESH = 1", nativeQuery = true)
    public List<Food> getMostFreshestFoods();
}

Мой класс обслуживания:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class FoodService {

    @Autowired
    private FoodRepository foodRepository;

    public List<Food> getMostFreshestFoods() {
        return foodRepository.getMostFreshestFoods();
    }
}

Мой класс объекта:

public class Food {

    private Long id;

    private String foodName;

    private boolean fresh;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getFoodName() {
        return foodName;
    }

    public void setFoodName(String foodName) {
        this.foodName = foodName;
    }

    public boolean isFresh() {
        return fresh;
    }

    public void setFresh(boolean fresh) {
        this.fresh = fresh;
    }
}

И мой тесткласс:

import myapp.Food;
import myapp.FoodRepository;
import myapp.FoodService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNull.notNullValue;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.verify;

@RunWith(MockitoJUnitRunner.class)
public class FoodTest {

    @Mock
    private FoodRepository foodRepository;

    @InjectMocks
    private FoodService foodService;

    @Captor
    private ArgumentCaptor<Food> foodArgumentCaptor;

    @Test
    public void testFreshestFoods() {

        Food food = new Food();
        food.setFoodName("Meat");
        food.setFresh(true);
        foodRepository.save(food);
        verify(foodRepository).save(foodArgumentCaptor.capture());
        assertThat(foodArgumentCaptor.getValue().getId(), is(notNullValue()));

        // Above I added mock data to database to query list from Service class method,
        // but I do not know how to do it. Using return always gives error

        // I want to do the following: Query the list from FoodService class and it should
        // return size 1 (the fake object (added above) )

    }


}

Но так как я новичок в Mockito, это немного сложно для меня.Я хотел бы знать, как я могу получить список из класса FoodService, и он должен возвращать поддельный объект, созданный в тестовом классе.

1 Ответ

1 голос
/ 07 марта 2019

Я верю, что вы ищете ниже. Вам не нужно делать нормальный рабочий процесс для тестирования с помощью Mockito. Еще один способ сказать, что вы не добавляете вещи в свою БД, а затем ожидаете получить их обратно. Мокито не знает базы данных. Он захватывает класс (поддельный) и возвращает то, что вы ему говорите, или выдает исключения, или просто ничего не делает. Идея состоит в том, чтобы изолировать тестируемый класс. Так что, в вашем случае, представьте, что данные находятся в хранилище, и просто верните их. Надеюсь, что это имеет смысл.

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

import java.util.List;

import static java.util.Arrays.asList;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

@RunWith(MockitoJUnitRunner.class)
public class FoodTest {

    @Mock
    private FoodRepository foodRepository;

    @InjectMocks
    private FoodService foodService;

    @Captor
    private ArgumentCaptor<Food> foodArgumentCaptor;

    @Test
    public void testFreshestFoods() {

        Food food = new Food();
        food.setFoodName("Meat");
        food.setFresh(true);

        // not needed
        //foodRepository.save(food);
        //verify(foodRepository).save(foodArgumentCaptor.capture());
        //assertThat(foodArgumentCaptor.getValue().getId(), is(notNullValue()));

        when(foodRepository.getMostFreshestFoods()).thenReturn(asList(food));

        List<Food> actual = foodService.getMostFreshestFoods();

        assertEquals(food, actual.get(0));
        verify(foodRepository).getMostFreshestFoods();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...