我有两个班级
@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;
答案 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已解答