Estoy usando Spring 3.1.4.RELEASE y Mockito 1.9.5. En mi clase de primavera tengo:
@Value("#{myProps['default.url']}")
private String defaultUrl;
@Value("#{myProps['default.password']}")
private String defaultrPassword;
// ...
De mi prueba JUnit, que actualmente he configurado así:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:test-context.xml" })
public class MyTest
{
Me gustaría simular un valor para mi campo "defaultUrl". Tenga en cuenta que no quiero simular valores para los otros campos; me gustaría mantenerlos como están, solo el campo "defaultUrl". También tenga en cuenta que no tengo ningún método "establecedor" explícito (por ejemplo setDefaultUrl
) en mi clase y no quiero crear ninguno solo para fines de prueba.
Dado esto, ¿cómo puedo simular un valor para ese campo?
ReflectionTestUtils.setField(bean, "fieldName", "value");
antes de invocar subean
método durante la prueba.Ahora era la tercera vez que buscaba en Google esta publicación de SO, ya que siempre olvido cómo burlarme de un campo @Value. Aunque la respuesta aceptada es correcta, siempre necesito algo de tiempo para que la llamada "setField" sea correcta, así que al menos para mí pego un fragmento de ejemplo aquí:
Clase de producción:
Clase de prueba:
fuente
También puede simular la configuración de su propiedad en su clase de prueba
fuente
Me gustaría sugerir una solución relacionada, que es pasar los
@Value
campos anotados como parámetros al constructor, en lugar de usar laReflectionTestUtils
clase.En lugar de esto:
y
Hacer esto:
y
Beneficios de este enfoque: 1) podemos crear una instancia de la clase Foo sin un contenedor de dependencia (es solo un constructor), y 2) no estamos acoplando nuestra prueba a los detalles de nuestra implementación (la reflexión nos vincula al nombre del campo usando una cadena, que podría causar un problema si cambiamos el nombre del campo).
fuente
Puede usar esta anotación mágica de Spring Test:
ver org.springframework.test.context.TestPropertySource
Por ejemplo, esta es la clase de prueba:
Y esta es la clase con la propiedad:
fuente
Usé el siguiente código y funcionó para mí:
Referencia: https://www.jeejava.com/mock-an-autowired-value-field-in-spring-with-junit-mockito/
fuente
Una forma de resolver esto es cambiar su clase para usar Constructor Injection , que se usa para pruebas e inyección Spring. No más reflexión :)
Entonces, puede pasar cualquier String usando el constructor:
Y en tu prueba, solo úsala:
fuente