Inyecte una implementación diferente para la prueba

Tengo las siguientes clases:

public interface Emailer {}

@Named    
public class RealEmailer implements Emailer {}

@Named
public class NoOpEmailer implements Emailer {}

And my service class uses the real emailer:

public class SomeService {
    @Inject
    private Emailer emailer;
}

The question is, in my service test class (SomeServiceTest), how do I inject the Emailer in the service to use NoOpEmailer ? I'm using Spring for the DI framework.

preguntado el 31 de enero de 12 a las 16:01

What dependency injection framework do you want to use? Doing it with GUICE is different than Spring, is different than... -

Sorry, I'm using Spring. I should've put it in the question. It's tagged with spring aunque. -

2 Respuestas

If you can use Spring 3.1 you can use perfiles. This would allow you to provide two different implementations of the same bean (Emailer and NoOpEmailer). Then in your test you can use the @Profile("test") annotation to activate the test profile and your no op bean will be injected.

Respondido el 31 de enero de 12 a las 21:01

Have you considered the possibility of making the field package scope rather then private as this would make it a lot simpler to set this field during your unit test (assuming your test class is in the same package as your subject).

If not, it seems to do this with Spring you would use ReflectionTestUtils#setField(Object target, String name, Object value) to inject this value into your class

Respondido el 31 de enero de 12 a las 21:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.