Использование @Mock и @InjectMocks
В настоящее время я изучаю фреймворк Mockito и создал несколько тестовых случаев с использованием Mockito. Но потом я прочитал, что вместо вызова mock (SomeClass.class) я могу использовать @Mock
и @InjectMocks
- Единственное, что мне нужно сделать, это пометить свой тестовый класс @RunWith(MockitoJUnitRunner.class)
или используйте MockitoAnnotations.initMocks(this);
в @Before
метод.
Но это не работает - кажется, что @Mock
не сработает! Вот мои 2 ревизии кодов - одна с аннотациями, а другая без.
Что я делаю неправильно?
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
}
Как я уже сказал - эта работа великолепна. Но следующее не будет:
@RunWith(MockitoJUnitRunner.class)
public class ReportServiceImplTestMockito {
@Mock
private TaskService mockTaskService;
@InjectMocks
private ReportServiceImpl service;
// Some tests
}
А вот и ReportServiceImpl
учебный класс:
@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;
}
}
Что мне не хватает?
3 ответа
ОК, я понял свою ошибку!!! Я использовал @InjectMocks
но инициализировал ту же переменную в методе init()... Итак, mockito ввел фиктивные объекты в мою переменную - но через несколько секунд я запустил ее - инициализировав ту же самую переменную!!!
Ваш код отлично работает для меня, используя Mockito 1.9.
Используя версию Mockito 1.8+, я получаю очень конкретное сообщение об ошибке, в котором рассказывается, как именно решить проблему. Как подсказывает php-кодер: для Mockito 1.8+ вам нужно инициализировать поле.
Вы видели это или любое другое сообщение об ошибке?
Редактировать:
Следующий код работает для меня. Небольшие изменения:
- Удалены весенние аннотации
- Удаленный интерфейс
- Добавлен Геттер
- Добавлен пустой
TaskService
- Добавлен тест с
System.out.println
Это выдает ошибку для вас?:
Обслуживание:
public class ReportServiceImpl {
private TaskService taskServiceImpl;
public ReportServiceImpl() {
}
public ReportServiceImpl(TaskService taskService) {
this.taskServiceImpl = taskService;
}
public void setTaskServiceImpl(TaskService taskServiceImpl) {
this.taskServiceImpl = taskServiceImpl;
}
public TaskService getTaskServiceImpl() {
return taskServiceImpl;
}
}
Зависимость:
public class TaskService {
}
Тест, печать mockTaskService
:
@RunWith(MockitoJUnitRunner.class)
public class ReportServiceImplTestMockito {
@Mock
private TaskService mockTaskService;
@InjectMocks
private ReportServiceImpl service;
@Test
public void testMockInjected() {
System.out.println(service.getTaskServiceImpl());
}
}
Я не уверен, но попробуйте создать новый экземпляр ReportServiceImpl
вручную (как вы сделали в рабочем примере):
@InjectMocks
private ReportServiceImpl service = new ReportServiceImpl();