@Autowired,@ Component和测试

Ran*_*ron 4 testing spring unit-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;
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

你会怎么做呢?

Tom*_*icz 10

利用@Primary注释:

@Service
@Primary
public class TestA implements A {
  //...
}
Run Code Online (Sandbox Code Playgroud)

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