Как использовать @InjectMocks для зависимости для другого класса, который будет издеваться?

#java #spring #dependency-injection #mockito #spring-test

#java #весна #зависимость-внедрение #mockito #spring-тест

Вопрос:

Допустим, у меня есть класс :

    public class Boy
          {
                 @Inject 
                 @Named("birthDay")
                 BirthDay bday;
          }
  

И я хочу издеваться над этим, но проблема в том, что сам класс BirthDay использует зависимость, которую я также хочу издеваться и контролировать, я не могу использовать как @InjectMocks, так и @Mock в одном классе, как вы добиваетесь того же?

Комментарии:

1. с какой проблемой вы сталкиваетесь, когда издеваетесь над днем рождения и создаете @injectmocks для мальчика?

2. Скажем, у дня рождения есть поле Date, которое я хочу издеваться и контролировать, и оно вводится в Birthday; как мне издеваться над ним в моем тестовом классе?

Ответ №1:

Зачем вам нужно что-то вводить в макет? Вам нужно иметь два тестовых класса для тестирования Boy и BirthDay классов.

Здесь вы должны протестировать логику Boy класса

 public class BoyTest{
  @Mock
  private BirthDay brithday;

  @InjectMock
  private Boy boy;
}
  

И логика a BirthDay должна иметь свой собственный тестовый класс.

 public class BirthDayTest {
  @Mock
  private Dependency dependency ;

  @InjectMock
  private BirthDay brithday;
}
  

Итак, вы должны предположить, что ваш макет возвращает некоторые данные, которые вам нужны. И убедитесь, что ваш тестируемый модуль работает должным образом с заданными данными.

Комментарии:

1. Я действительно хочу использовать функцию в этом макете (она обращается к DAO, который в конечном итоге сохраняет данные, я хочу издеваться над тем же). Нужно ли мне использовать ручной DAO для того же? Или я могу использовать when-then для этого?

2. Я бы предпочел использовать предложение when-then . Поскольку вы тестируете класс Boy, поэтому вы должны предположить, что ваш макет возвращает нужные вам данные. В противном случае это больше не модульный тест.

3. Что делать, если вы хотите подготовить некоторые зависимости для «@InjectMock», которые не могут обрабатываться @Mock. Например, контекст.

4. @Kenji Я не уверен, что понял ваш вопрос, но если вы хотите передать реальную реализацию, то вы можете инициализировать поле самостоятельно и пометить его @Spy следующим образом: @Spy private Context context = new Context();

5. @SergiiBishyr Тогда его можно использовать с помощью объекта редактирования «@Mocke»?