Saltar al contenido

Inyectando una propiedad String con @InjectMocks

Solución:

No puede hacer esto con Mockito, pero Apache Commons en realidad tiene una forma de hacerlo usando una de sus utilidades integradas. Puede poner esto en una función en JUnit que se ejecuta después de que Mockito inyecte el resto de los simulacros, pero antes de que se ejecuten sus casos de prueba, así:

@InjectMocks
MyClass myClass;

@Before
public void before() throws Exception {
    FieldUtils.writeField(myClass, "fieldName", fieldValue, true);
}

No puedes hacer esto con Mockito, porque, como tú mismo mencionaste, un String es final y no puede ser burlado.

Hay un @Spy anotación que funciona en verdadero objetos, pero tiene las mismas limitaciones que @Mock, por lo que no puedes espiar a un String.

No hay una anotación para decirle a Mockito que simplemente inyecte ese valor sin hacer ninguna burla o espionaje. Sin embargo, sería una buena característica. Quizás lo sugiera en el repositorio de Mockito Github.

Tendrá que crear una instancia manual de su controlador si no desea cambiar su código.

La única forma de tener una prueba pura basada en anotaciones es refactorizar el controlador. Puede usar un objeto personalizado que solo contenga esa propiedad, o quizás una clase de configuración con múltiples propiedades.

@Component
public class MyProperty {

    @Value("${my.property}")
    private String myProperty;

    ...
}

Esto se puede inyectar en el controlador.

@Autowired
public AbcController(XyzService xyzService, MyProperty myProperty) { 
    ... 
}

Puedes burlarte e inyectar esto entonces.

@RunWith(MockitoJUnitRunner.class)
public class AbcControllerTest {

    @Mock
    private XyzService mockXyzService;

    @Mock
    private MyProperty myProperty;

    @InjectMocks
    private AbcController controllerUnderTest;

    @Before
    public void setUp(){
        when(myProperty.get()).thenReturn("my property value");
    }

    /* tests */
}

Esto no es muy sencillo, pero al menos podrá tener una prueba basada en anotaciones pura con un poco de stubbing.

Ya que está usando Spring, puede usar el org.springframework.test.util.ReflectionTestUtils desde el spring-test módulo. Envuelve cuidadosamente la configuración de un campo en un objeto o un campo estático en una clase (junto con otros métodos de utilidad).

@RunWith(MockitoJUnitRunner.class)
public class AbcControllerTest {

    @Mock
    private XyzService mockXyzService;

    @InjectMocks
    private AbcController controllerUnderTest;

    @Before
    public void setUp() {
        ReflectionTestUtils.setField(controllerUnderTest, "myProperty", 
               "String you want to inject");
    }

    /* tests */
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *