#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»?