@postya

Как тестировать слой контроллера в Spring Boot с Mockito?

У меня Spring Boot приложение состоит из трёх слоев: Repository(БД) , Service(Бизнес логика) и Controller

Я пока написал один метод, который достает все записи из БД

Как протестировать метод findAll в слое контроллера с Mockito?

Из чего состоит проект:

Model:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "video")
public class Video {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String title;
    private String url;
}


Repository:
@Repository
public interface VideoRepository extends JpaRepository<Video, Integer> {
}

Service:
public interface VideoService {
    List<Video> findAll();
}


VIdeoServiceImpl:
@Service
public class VideoServiceImpl implements VideoService{

    @Autowired
    private VideoRepository videoRepository;

    @Override
    public List<Video> findAll() {
        return videoRepository.findAll();
    }
}


метод findAll в слое Service успешно протестирован:
class VideoServiceImplTest {

    @InjectMocks
    VideoServiceImpl videoService;

    @Mock
    VideoRepository videoRepository;

    private Video videoOne = new Video(1, "kultas", "https://webnsdf");
    private Video videoTwo = new Video(2, "joshua", "https://343heth");
    private Video videoThree = new Video(3, "ambient mix", "https://ambientsome");

    @BeforeEach
    public void init() throws Exception {
        MockitoAnnotations.initMocks(this);
    }


    @Test
    void findAll() {

        List<Video> list = new ArrayList<>();

        list.add(videoOne);
        list.add(videoTwo);
        list.add(videoThree);

        when(videoRepository.findAll()).thenReturn(list);
    }
}
  • Вопрос задан
  • 1497 просмотров
Решения вопроса 1
@postya Автор вопроса
Нашел такое решение:

import ga.rusanov.backend.model.Video;
import ga.rusanov.backend.service.VideoService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.web.servlet.MockMvc;

import java.util.ArrayList;
import java.util.List;

import static org.hamcrest.Matchers.hasSize;
import static org.mockito.BDDMockito.given;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@WebMvcTest(controllers = VideoController.class)
class VideoControllerTest {


    @MockBean
    private VideoService videoService;

    @Autowired
    private MockMvc mockMvc;

    private List<Video> videoList;

    @BeforeEach()
     void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);

        this.videoList = new ArrayList<>();
        this.videoList.add(new Video(1, "kultas", "https://webnsdf"));
        this.videoList.add(new Video(2, "joshua", "https://343heth"));
        this.videoList.add(new Video(3, "ambient mix", "https://ambientsome"));
    }

    @Test
    void shouldGetAllVideos() throws Exception{

        Mockito.when(videoService.findAll()).thenReturn(videoList);

        given(videoService.findAll()).willReturn(videoList);
        this.mockMvc.perform(get("/api/video/all"))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.*", hasSize(3)));
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы