Mockito when() requires an argument which has to be a method call on a mock
By:Roy.LiuLast updated:2019-08-11
Run the following Spring Boot + JUnit 5 + Mockito integration test.
package com.mkyong.core.services; import com.mkyong.core.repository.HelloRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.springframework.boot.test.context.SpringBootTest; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.when; @SpringBootTest public class HelloServiceMockTest { @Mock private HelloRepository helloRepository; @InjectMocks // auto inject helloRepository private HelloService helloService = new HelloServiceImpl(); @BeforeEach void setMockOutput() { when(helloService.getDefault()).thenReturn("Hello Mockito"); //...
But hits the following errors:
when() requires an argument which has to be 'a method call on a mock'. For example: when(mock.getArticles()).thenReturn(articles); Also, this error might show up because: 1. you stub either of: final/private/equals()/hashCode() methods. Those methods <strong>cannot</strong> be stubbed/verified. Mocking methods declared on non-public parent classes is not supported. 2. inside when() you don't call method on mock but on some other object.
Solution
This when(mock.getArticles()).thenReturn(articles); need to apply on mocked object. When Mockito see this @InjectMocks, it doesn’t mock it, it just creates a normal instance, so the when() will be failed.
To solve it, annotate @spy to mock it partially.
package com.mkyong.core.services; import com.mkyong.core.repository.HelloRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; import org.springframework.boot.test.context.SpringBootTest; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.when; @SpringBootTest public class HelloServiceMockTest { @Mock private HelloRepository helloRepository; @Spy // mock it partially @InjectMocks private HelloService helloService = new HelloServiceImpl(); @BeforeEach void setMockOutput() { when(helloService.getDefault()).thenReturn("Hello Mockito"); //...
From:一号门
Previous:Spring REST Hello World Example
COMMENTS