【问题标题】:Inject different implementation for testing注入不同的实现进行测试
【发布时间】:2012-01-31 16:53:12
【问题描述】:

我有以下课程:

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 框架。

【问题讨论】:

  • 你想用什么依赖注入框架?用 GUICE 做这件事不同于 Spring,不同于...
  • 对不起,我正在使用 Spring。我应该把它放在问题中。不过它的标签是spring

标签: java spring testing dependency-injection


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    如果不是,它似乎使用 Spring 执行此操作,您将使用 ReflectionTestUtils#setField(Object target, String name, Object value) 将此值注入到您的类中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-08
      • 1970-01-01
      相关资源
      最近更新 更多