5
votes

I am trying to write a simple API to retrieve paged data. My program runs and 'finds all' when not paged. However when I call findAll(Pageable) from the mock repository (Mockito), it returns null.

TaskService.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;
    }

TaskRepository.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);
}

TaskServiceTest.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();
    }
}

In TaskServiceImpl.java .findAll(pageRequest) returns null. I am not very familiar with Mockito and wondering if creating a mock repository with it is causing issues? It works just fine when I do .findAll() with no pagination. Is there something wrong with how I am using findAll(Pageable) method from the PagingAndSortingRepository. Thanks!

2

2 Answers

13
votes

You could solve this by two ways.

Using Mock:

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

Or, Using class instantiation:

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

You mock a call to the findAll() without parameters and only that will return what you set. To mock a call to the overload that takes a parameter you need to call

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

You probably should import org.mockito.Matchers statically to improve readability. You can also use an ArgumentCaptor if you want to verify something about the passed object.