更改测试中注入的@Component

时间:2014-10-23 05:53:12

标签: java spring testing dependency-injection

我有两个班级

@Component
public class A {

  @Autowired
  B b;
}

@Component
public class B {
}

他们是通过Spring的扫描找到的。

现在我想测试A,但我需要提供不同的impl。 B的{​​{1}},BMock

如何让Spring找到不同的B而不是标准(生产中只有一个)?

我的测试注释为:

@ContextConfiguration(locations = "classpath:/test-context.xml")

在哪个文件中定义了一些实例(DAO,..),然后在我写的测试类中

@Autowired
A testInstance;

3 个答案:

答案 0 :(得分:2)

你不需要Spring。这就是依赖注入的全部要点:您可以在单元测试中明确地注入您想要的任何内容。单元测试不应该使用Spring。

// constructor injection
B mockB = mock(B.class);
A aUnderTest = new A(mockB);

// setter injection
B mockB = mock(B.class);
A aUnderTest = new A();
aUnderTest.setB(mockB);

// Field injection, requiring reflection, done by Mockito
@Mock
private B mockB;

@InjectMocks
private A aUnderTest;

@Before
public void initMocks() {
    MockitoAnnotations.initMocks(this);
}

答案 1 :(得分:0)

您可以创建单独的xml文件用于测试目的并注入另一个B(BMock)对象,并且在生产中您可以注入B.因此,有两个单独的配置文件,一个用于生产,另一个用于测试。

答案 2 :(得分:0)

根据Spring documentation

Annotation injection is performed before XML injection, thus the latter 
configuration will override the former for properties wired through both approaches.

因此,您可以在测试环境中覆盖Spring context文件,以提供测试实现。但是,如果您有多个实现,则无法单独使用@Autowire。您还需要使用@Qualifier。所以最好的方法是mock测试实现并使用setter注入JB Nizet已解答