注入不同的实现以进行测试

时间:2012-01-31 16:53:13

标签: java spring testing dependency-injection

我有以下课程:

public interface Emailer {}

@Named    
public class RealEmailer implements Emailer {}

@Named
public class NoOpEmailer implements Emailer {}

我的服务类使用真实的电子邮件:

public class SomeService {
    @Inject
    private Emailer emailer;
}

问题是,在我的服务测试类(SomeServiceTest)中,如何在服务中注入Emailer以使用NoOpEmailer?我正在使用Spring作为DI框架。

2 个答案:

答案 0 :(得分:3)

如果您可以使用Spring 3.1,则可以使用Profiles。这将允许您提供同一个bean的两个不同实现(Emailer和NoOpEmailer)。然后在测试中,您可以使用@Profile(“test”)注释来激活测试配置文件,并且将注入无操作bean。

答案 1 :(得分:1)

您是否考虑过制作字段包范围而非私有的可能性,因为这会使您在单元测试期间设置此字段变得更加简单(假设您的测试类与主题位于同一个包中)。

如果没有,它似乎用Spring执行此操作,您可以使用ReflectionTestUtils#setField(Object target, String name, Object value)将此值注入您的类