Spring Boot 分页 - Mockito 存储库 findAll(可分页) 返回 null



我正在尝试编写一个简单的API来检索分页数据。我的程序运行并在未分页时"查找所有"。但是,当我从模拟存储库(Mockito(调用findAll(Pageable(时,它返回null。

任务服务.java

import com.example.task.dto.TaskResponse;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import java.util.List;
public interface TaskService {
    Page<TaskResponse> findAll(Pageable pageRequest);
}

TaskServiceImpl.java

import com.example.task.domain.TaskEntity;
import com.example.task.dto.TaskResponse;
import com.example.task.repository.TaskRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
public class TaskServiceImpl implements TaskService {
    private TasksRepository tasksRepository;
    public TaskServiceImpl(TasksRepository tasksRepository) {
        this.tasksRepository = tasksRepository;
    }
    @Override
    public Page<TaskResponse> findAll(Pageable pageRequest) {
        Page<TaskEntity> tasks = this.taskRepository.findAll(pageRequest); <=== HERE IT RETURNS NULL
        return tasks;
    }

任务存储库.java

package com.example.task.repository;
import com.example.task.domain.TaskEntity;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface TaskRepository extends JpaRepository<TaskEntity, Long>, PagingAndSortingRepository<TaskEntity, Long> {
    Page<TaskEntity> findAll(Pageable pageRequest);
}

任务服务测试.java

package com.example.task.service;
import com.example.task.domain.TaskEntity;
import com.example.task.repository.TaskRepository;
import org.junit.jupiter.api.Test;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.mockito.Mockito.*;
class TaskServiceTest {
    private TaskRepository taskRepository = mock(TaskRepository.class);
    private TaskServiceImpl taskService = new TaskServiceImpl(taskRepository);
    @Test
    void FindAll_ReturnsAPagedListOfTasks() {
        when(taskRepository.findAll()).thenReturn(Arrays.asList(
                new TaskEntity(1L, "Fake task 1"),
                new TaskEntity(2L, "Fake task 2"),
                new TaskEntity(3L, "Fake task 3"),
                new TaskEntity(4L, "Fake task 4")
        ));
        Pageable pageRequest = PageRequest.of(0, 4);
        List<TaskResponse> tasks = taskService.findAll(pageRequest).getContent();
        assertThat(tasks.size(), equalTo(4));
        verify(taskRepository).findAll();
    }
}

在 TaskServiceImpl 中.java.findAll(pageRequest( 返回 null。我对 Mockito 不是很熟悉,想知道使用它创建模拟存储库是否会导致问题?当我在没有分页的情况下执行 .findAll(( 时,它工作得很好。我使用来自分页和排序存储库的findAll(可分页(方法的方式是否有问题。谢谢!

您可以通过两种方式解决此问题。

使用模拟:

Page<TaskEntity> tasks = Mockito.mock(Page.class);
Mockito.when(this.taskRepository.findAll(org.mockito.Matchers.isA(Pageable.class))).thenReturn(tasks);

或者,使用类实例化:

List<TaskEntity> tasks = new ArrayList<>();
Page<TaskEntity> pagedTasks = new PageImpl(tasks);
Mockito.when(this.taskRepository.findAll(pagedTasks)).thenReturn(pagedTasks);

你模拟对没有参数的findAll()的调用,只有这样才会返回你设置的内容。要模拟对采用参数的重载的调用,您需要调用

when(taskRepository.findAll(org.mockito.Matchers.isA(Pageable.class)).thenReturn(...)

您可能应该静态导入org.mockito.Matchers以提高可读性。如果要验证有关传递的对象的某些内容,也可以使用 ArgumentCaptor。

相关内容

  • 没有找到相关文章

最新更新