Разъяснение о @Spy и @InjectMocks в загрузке @Service Spring - PullRequest
0 голосов
/ 23 ноября 2018

Ну, я очень запутался в @Spy и @Mock.В моем понимании @Spy будет вызывать реальные методы, а @ Mock / @ InjectMocks - нет, потому что это всего лишь фиктивный вывод, тогда мне нужна заглушка (when.thenReturn), если я хочу изменить поведение макета.

В моем тестовом классе у меня есть этот код:

@RunWith(MockitoJUnitRunner.class)
public class CaixaServiceTest {

    @InjectMocks
    private CaixaService caixaService;

    @Mock
    private CaixaRepository caixaRepository;

Итак, CaixaRepository - это интерфейс JpaRepository из Spring Data, а CaixaService просто имеет очень простой метод:

public void calcular(){
        int a = (int) Math.pow(1,3);
        log.info(a);
    }

Еслия называю caixaRepository.findOne(id) null должен быть возвращен, потому что findOne никогда не вызывается на самом деле, потому что это просто фальшивка.Этот случай работает очень хорошо.

Но когда я вызываю caixaService.calcular(), тело метода выполняется (не должно, потому что это фальшивка), поэтому log.info(a) регистрируется в моем файле.

Я не могу понять это поведение, потому что, как я уже сказал, @InjectMocks или @Mock не должны ничего выполнять, если заглушка не существует, это задача @Spy.

1 Ответ

0 голосов
/ 23 ноября 2018

Все правильно, но ваше понимание @InjectMocks.
Действительно, аннотирование поля с ним не создаст фиктивный объект, как вы думаете.
Вместо этого он попытается внедрить фиктивные зависимости в объектна него ссылается поле, в котором есть аннотация.
Обратите внимание, что этот способ внедрения зависимостей не является явным, и поэтому не документирует зависимости, которые могут быть имитированы в вашем тесте.
Кроме того, если внедрение зависимостей завершится неудачно, Mockito не будетсообщить о любой ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...