I’m currently studying the Mockito framework and I’ve created several test cases using Mockito.
But then I read that instead of invoking mock(SomeClass.class) I can use the @Mock and the @InjectMocks – The only thing I need to do is to annotate my test class with @RunWith(MockitoJUnitRunner.class) or use the MockitoAnnotations.initMocks(this); in the @Before method.
But it doesn’t work – It seems that the @Mock won’t work!
Here is my 2 codes revisions – one using the annotations and one without.
What am I doing wrong?
public class ReportServiceImplTestMockito {
private TaskService mockTaskService; // This is the Mock object
private ReportServiceImpl service;
@Before
public void init(){
service = new ReportServiceImpl();
mockTaskService = mock(TaskServiceImpl.class);
service.setTaskServiceImpl(mockTaskService);
}
/// ...
Some tests
}
As I said – this work great.
But the following wont:
@RunWith(MockitoJUnitRunner.class)
public class ReportServiceImplTestMockito {
@Mock
private TaskService mockTaskService;
@InjectMocks
private ReportServiceImpl service;
// Some tests
}
And here is the ReportServiceImpl class:
@Service
public class ReportServiceImpl implements ReportService {
@Autowired
private TaskService taskServiceImpl;
public ReportServiceImpl(){}
public ReportServiceImpl(TaskService taskService){
this.taskServiceImpl = taskService;
}
public void setTaskServiceImpl(TaskService taskServiceImpl) {
this.taskServiceImpl = taskServiceImpl;
}
}
What am I missing?
O.K, I got my mistake!!!
I’ve used the
@InjectMocksbut initialized the same variable in the init() method…So what happened was that mockito injected the mock objects to my variable – but seconds later I ran it over – initializing that very same variable!!!