当前位置: 首页 > 知识库问答 >
问题:

Spring Boot pagination-Mockito存储库findAll(pagable)返回null

尹超
2023-03-14
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);
}
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()没有分页。我使用PagingAndSortingRepository中的findAll(Pageable)方法有问题吗?谢了!

共有1个答案

潘自强
2023-03-14

你可以用两种方法来解决这个问题。

使用mock:

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()返回空列表。我有多个jpa存储库,但只有一个不工作。这是代码: 这就是实体: 当我调用product类别epository.findAll()时,它返回空列表,因此我在数据库中有许多条目。谢谢你的帮助!

  • 我希望使用方法获得表中所有值的列表。 这是我尝试过的: user.java IUserDAO.java UserRepository.java IntelliJ生成的代码: UserController.java 我得到的输出总是。为什么?

  • 此示例存储库有一个方法 现在不需要使用Robolectric来单元测试了吗?

  • 嗨团队, 我正在使用Spring Boot 2.3.12。内部使用Spring Data Redis 2.3.9的版本。作为托管依赖项发布。 当我试图使用Spring Boot CRUD存储库将对象保存到Redis缓存时,它正在毫无错误地存储,我可以通过Redis管理器看到存储的对象。 但是,当我尝试使用相同的id(即使用CRUD repository的findById()方法)获取相同的对象时,

  • 问题内容: 我创建了一个简单的存储库,其中包含系统中的所有人员,一切似乎都正常运行。我可以根据给定的键和值添加,删除甚至取回单个人,但是由于某种原因,我无法直接取回存储在存储库中的所有人。我尝试通过使用findAll()方法来执行此操作,该方法应返回一个可迭代的对象。然后,我尝试使用可迭代对象进行迭代,并将每个人存储在要函数返回的arraylist中。 打印线打印“ 3”,因此存储库不为空,但在以

  • 是否有一种方法可以使通用Spring数据JPA存储库正确处理类似的方法?例如只返回狗,而不返回所有动物?或者至少,最好的变通方法是什么? 它的工作几乎完美,保存每一个动物在自己的桌子上,等等。唯一的问题是:同时返回水豚和狗。这个答案解释说: 这只有在域类使用单表继承时才起作用。我们在引导时能得到的关于domain类的唯一信息是它将是Product对象。因此,对于像findAll()甚至findBy