@Autowired,@ Component和测试

时间:2011-07-12 20:18:35

标签: unit-testing spring testing annotations autowired

您将如何进行集成测试注释配置和组件扫描的Spring应用程序,并且根本没有XML配置?我需要用测试组件替换生产组件而不需要实际使用xml配置或反射注入到所有@autowired部件。

示例:

interface A {...}

@Component
class AImpl implements A {
    ...
}


interface B {...}

@Component 
class BImpl implements B {
    @Autowired A a;
    ...
}


interface C {...}

class CImpl implements C {
    @Autowired B b;
    ...
}

然后在我的测试中我想使用ATestImpl,但我只能访问C(集成测试C)。

你会怎么做呢?

5 个答案:

答案 0 :(得分:10)

利用@Primary注释:

@Service
@Primary
public class TestA implements A {
  //...
}

如果有多个bean实现A,Spring会更喜欢用@Primary注释的bean。如果您将TestA类放在/src/test/java中,它将仅在测试执行期间被选中,在正常上下文启动时,Spring将看不到TestA并仅使用avaialble AImpl

答案 1 :(得分:2)

使用专用的spring上下文XML文件,您可以使用AImpl的实例覆盖ATestImpl。当然,它使用XML,但我没有看到任何其他解决方案(除了使用ATestImpl带注释的类而不是AImpl类重新打包应用程序)

答案 2 :(得分:1)

Spring 3.1中新的Bean Profile功能解决了通过定义配置文件来交换注入组件进行测试的需要,例如:测试,生产等。

博文的链接是here。 Spring团队今天发布了Spring 3.1的第​​二个里程碑版本。

答案 3 :(得分:1)

您可以对测试使用特殊组件扫描,排除“普通”类并添加测试类。

如果您有多个不同的测试类,那么它们不应该有@Component注释(或@Service,...)。相反,它们应该是{Bean}声明的loaded。因此,您可以为不同的设置使用不同的XML文件。

<context:component-scan base-package="com.queomedia.sgcrm.base">
    <context:exclude-filter expression="com\.example\.AImpl" type="regex"/>
</context:component-scan>

<bean class="com.example.ATestImpl"/>

答案 4 :(得分:1)

使用Spring注释配置类,将@Bean方法编码为接口。 prod配置可以在高级包上执行组件扫描以加载prod对象,测试配置可以单独指定bean以返回对象的测试版本。这对于需要伪造服务调用和DAO对象的组件测试非常有效。