【发布时间】:2016-07-01 02:35:21
【问题描述】:
我对春季的 DI 有点困惑
public interface A{
void methodA();
}
public class AImpl implements A{
public void methodA(){
// todo something
}
}
public interface B{
void methodB();
}
public class BImpl implements B{
public void methodB(){
//todo somethong
}
}
我有两个接口 A 和 B 和 2 个类实现它。 所以,我有 2 个实现接口 C 的类,它依赖于接口 A 和 B
这是案例 1:
public interface C{
void methodC();
}
public class CAutowired implements C{
@Autowired
private A a;
@Autowired
private B b;
public void methodC(){
a.methodA();
b.methodB();
}
}
文件 .xml 配置
<beans>
<bean id="classA" class="com.example.AImpl" />
<bean id="classB" class="com.example.BImpl" />
<bean id="classC" class="com.example.CAutowired" />
<beans>
在这种情况下,我有一个问题: - 当我为 CAutowired 类编写 unitTest 时如何模拟 A 和 B
这是案例 2:
public class CInitInject implements C{
private A a;
private B b;
public CInitInject(A a, B b){
this.a = a;
this.b = b;
}
public void methodC(){
a.methodA();
b.methodB();
}
}
文件 .xml 配置
<beans>
<bean id="classA" class="com.example.AImpl" />
<bean id="classB" class="com.example.BImpl" />
<bean id="classC" class="com.example.CInitInject">
<constructor-arg ref="classA" />
<constructor-arg ref="classB" />
</bean>
<beans>
在这种情况下,我在 .NET 中获得了相同的 DI 方法。我可以通过注入来模拟 A 和 B 进入构造函数。示例:
@Mock
private A aMock;
@Mock
private B bMock;
private C c;
public void setUp(){
c = new CInitInject(aMock, bMock);
}
@Test
public void test(){
// todo Test somemethod
}
最后,我有一个问题
- 案例 1 和案例 2 之间的最佳做法是什么?
- 如何在单元测试时模拟它
【问题讨论】:
标签: spring unit-testing dependency-injection mocking mockito