es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No puedo inyectar un mock utilizando Dagger.

Soy nuevo en Dagger y Mockito. Estoy intentando utilizar un constructor definido en un módulo de Dagger en una prueba unitaria para que el objeto se cree con valores predeterminados.

Este es el módulo:

@Module
class AutoCloseCountDownTimerModule {

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

}

Así es como intenté simular la clase AutoCloseCountDown en la prueba unitaria:

@RunWith(MockitoJUnitRunner.class)
public 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);
    }

}

¿Cómo puedo lograr que autoclosedCountDownTimer se utilice en la prueba con los valores predefinidos por dagger?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para usar el objeto AutoCloseCountDownTimer con los valores predefinidos por Dagger en tu prueba unitaria, necesitas crear una versión de prueba del módulo Dagger que proporcione objetos falsos en lugar de la implementación real. Aquí tienes un ejemplo de cómo puedes modificar el código de prueba para lograr esto:

    1. Crea una versión de prueba del módulo Dagger que proporcione el objeto AutoCloseCountDownTimer falso:

    @Module
    class TestAutoCloseCountDownTimerModule {

    @Provides
    @Singleton
    fun getAutoCloseCountDownTimer(
        userInteractionClient: UserInteractionClient,
        rxPositionManager: RxPositionManager
    ): AutoCloseCountDownTimer {
        val mockAutoCloseCountDownTimer = Mockito.mock(AutoCloseCountDownTimer::class.java)
        return mockAutoCloseCountDownTimer
    }
    

    }

    Ten en cuenta que en este módulo de prueba estás proporcionando una versión falsa de AutoCloseCountDownTimer en lugar de la implementación real.

    1. Modifica tu prueba unitaria para usar el módulo de prueba en lugar del real:

    @RunWith(MockitoJUnitRunner.class)
    public class AutoCloseCountDownTimerTest {

    @InjectMocks
    private AutoCloseCountDownTimer autoCloseCountDownTimer;
    
    @Before
    public void setUp() {
        DaggerTestAutoCloseCountDownTimerComponent.builder()
            .testAutoCloseCountDownTimerModule(new TestAutoCloseCountDownTimerModule())
            .build()
            .inject(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);
    }
    

    }

    En este código de prueba modificado, estás inyectando el objeto AutoCloseCountDownTimer falso utilizando el módulo de prueba que has creado. El objeto se crea con los valores predeterminados definidos en la implementación falsa.

    Siguiendo estos pasos, deberías poder utilizar el constructor definido en el módulo Dagger en la prueba unitaria con valores predeterminados.

Comments are closed.