Подтвердить что ты не робот

Использование @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;
    }
}

Что мне не хватает?

4b9b3361

Ответ 1

О.К., я получил свою ошибку!!! Я использовал @InjectMocks, но инициализировал ту же переменную в методе init()... Так что случилось, что mockito ввел ложные объекты в мою переменную, но через несколько секунд я ее запустил - инициализировал ту же самую переменную!!!

Ответ 2

Ваш код отлично работает для меня, используя Mockito 1.9.

Используя версию Mockito версии 1.8+, я получаю очень специфическое сообщение об ошибке, сообщающее мне, как решить проблему. Как предполагает php-кодер: для Mockito 1.8+ вам нужно инициализировать поле.

Вы видели это или любое другое сообщение об ошибке?

Edit:

Следующий код работает для меня. Небольшие изменения:

  • Удалены аннотации Spring
  • Удаленный интерфейс
  • Добавлен Getter
  • Добавлен пустой 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());
    }
}

Ответ 3

Я не уверен, но попробуйте создать новый экземпляр ReportServiceImpl вручную (как в рабочем примере):

 @InjectMocks 
 private ReportServiceImpl service = new ReportServiceImpl();