не в состоянии ввести мок с помощью кинжала

#java #android #junit #mockito #dagger-2

Вопрос:

Я новичок в Кинжале и Мокито. Я пытаюсь использовать конструктор, определенный в модуле Dagger в модульном тесте, чтобы объект создавался со значениями по умолчанию.

Это модуль:

@Класс модуля AutoCloseCountDownTimerModule {

 @Provides @Singleton fun getAutoCloseCountDownTimer(  userInteractionClient: UserInteractionClient,  rxPositionManager: RxPositionManager ): AutoCloseCountDownTimer {  return AutoCloseCountDownTimer(userInteractionClient, rxPositionManager, 15000, 45000) }  

Вот как я пытался издеваться над классом AutoCloseCountDown в модульном тесте:

@RunWith(MockitoJUnitRunner.class) публичный класс AutoCloseCountDownTimerTest {

 @Mock private AutoCloseCountDownTimer autoCloseCountDownTimer;  @Before public void setUp() {  MockitoAnnotations.initMocks(this); }  @Test public void basicTest() {  final AutoCloseCountDownTimer.Listener mockListener = Mockito.mock(AutoCloseCountDownTimer.Listener.class);  autoCloseCountDownTimer.registerListener(mockListener);   final int expectedValue = 10;  autoCloseCountDownTimer.notifyOnAutoClose(expectedValue);  Mockito.verify(mockListener).onAutoClose(expectedValue);  

Как я могу добиться того, чтобы в тесте использовался параметр autoclosedCountDownTimer со значениями, заданными dagger?

Ответ №1:

Как правило, вы и не пытаетесь. В тестах вы обычно не вводите параметры в тестируемый объект, вы передаете их напрямую через новый. Которые могут быть обычными или имитационными предметами.

Если вам действительно нужно внедрить, вам нужно будет настроить модуль, который предоставляет объект с помощью функции, аннотированной @Provides, и который создает макет и передает его в параметр при создании экземпляра объекта. Вам также нужно будет сделать это транзитивно с любыми зависимостями, которые вы не издеваетесь. Затем создайте компонент для этого модуля и любых других, которые вам нужны, и используйте этот компонент для внедрения. Но вы действительно хотите избежать этого, если это возможно, модульные тесты должны быть посвящены тестированию небольших функциональных возможностей.