Использование @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();
Другие вопросы по тегам