-2

Mockito really kill for the below error.

@Query("SELECT e FROM Employee e WHERE e.status='A' AND LOWER(e.department.useCode)=LOWER(:flag) AND e.department.status='A' ")
Page<Employee> findAllDetails(@Param("flag") String flag, Pageable pageable);

Error:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers!
2 matchers expected, 1 recorded:
-> at com.xxx.service.EmployeeServiceTest.test_findEmployeesPageable(EmployeeServiceTest.java:146)

This exception may occur if matchers are combined with raw values:
    //incorrect:
    someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
    //correct:
    someMethod(anyObject(), eq("String by matcher"));

For more info see javadoc for Matchers class.

    at com.xxx.service.EmployeeServiceTest.test_findEmployeesPageable(EmployeeServiceTest.java:146)
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89)
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:97)
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87)
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)

Code:

@Override
public Page<EmployeeDto> findEmployeePageable(Pageable pageableReq, String sortParam, String direction, String useCd) {
    Pageable pageable = Utils.sort(pageableReq, sortParam, direction);

    Page<Employee> response = null;
    if(pageable.getSort().isSorted()) {
        response = employeeRepository.findAllDetails(code, pageable);
    }else {
        response = employeeRepository.findAllDetailsNewDetails(useCd, pageable);
    }
    List<EmployeeDto> employeeResponse = getResponses(response.getContent());
    return new PageImpl<>(employeeResponse, response.getPageable(), response.getTotalElements()); 
}

Test class

@RunWith(PowerMockRunner.class)
@PrepareForTest({PCUtils.class })
public class EmployeeServiceTest {
    @InjectMocks
    private EmployeeServiceimpl employeeServiceimpl;
    @Mock
    private Pageable pageableMock;
    @Mock
    private Page<Employee> employeePage;

    @Mock
    private EmployeeRepository employeeRepository;
    @Mock
    private EmployeeRepository programRepositoryMock;
    @Mock
    private RoleTypeRepository roleTypeRepository;

    @Mock
    private RoleType roleTypeMock;

    @Mock
    private Employee employee;
    @Mock
    private Optional<Employee> employeeOptional;
    @Mock
    private Employee programMock;
    @Mock
    private Optional<Employee> programOptionalMock;
    @Mock
    private EmployeeDto employeeDto;
    @Mock
    private Sort sortMock;
    @Mock
    private Exception ex;
    @Mock
    private Environment env;

    @Test
    public void test_findEmployeesPageable() {      
        when(employeeRepository.findAllByStatusAndRoleTypeActive(anyString(), pageableMock)).thenReturn(employeePage);
        when(pageableMock.getPageNumber()).thenReturn(1);
        when(pageableMock.getSort()).thenReturn(sortMock);

        assertNotNull(employeeServiceimpl.findEmployeePageable(pageableMock, anyString(), anyString(), anyString()));
    }
}
Jeff Cook
  • 7,956
  • 36
  • 115
  • 186

2 Answers2

1

Your problem is the line

 assertNotNull(employeeServiceimpl.findEmployeePageable(pageableMock, anyString(), anyString(), anyString()));

That's not what anyString() does. In short, anyString() is for matching method arguments when you

  • stub a method (tell Mockito how to act when a method is called), or
  • verify a method (ask Mockito whether the method was called).

But here, you're trying to use anyString() in a different way entirely. It looks like you're trying to make Mockito invent arguments to pass to your method. That's not what Mockito does.

So you'll have to provide your own arguments to that method. Maybe something like

employeeServiceimpl.findEmployeePageable(pageableMock, "test sort", "test direction", "test use cd");
Dawood ibn Kareem
  • 77,785
  • 15
  • 98
  • 110
0

Try replacing

@Test
public void test_findEmployeesPageable() {      
    when(employeeRepository.findAllByStatusAndRoleTypeActive(anyString(), pageableMock)).thenReturn(employeePage);
    when(pageableMock.getPageNumber()).thenReturn(1);
    when(pageableMock.getSort()).thenReturn(sortMock);

    assertNotNull(employeeServiceimpl.findEmployeePageable(pageableMock, anyString(), anyString(), anyString()));
}

with

@Test
public void test_findEmployeesPageable() {      
    when(employeeRepository.findAllByStatusAndRoleTypeActive("", pageableMock)).thenReturn(employeePage);
    when(pageableMock.getPageNumber()).thenReturn(1);
    when(pageableMock.getSort()).thenReturn(sortMock);

    assertNotNull(employeeServiceimpl.findEmployeePageable(pageableMock, "", "", ""));
}

That also improves the readability of your test massively, because which normal user passes in a "Mockito.anyString()" as method argument?

Smutje
  • 17,733
  • 4
  • 24
  • 41