我们说我有一个构造函数:
public Something(A a) {
this.a = a;
this.b = a.someLogicMethod();
this.c = b.someLogicMethod();
}
@Autowired
private Class d;
此代码是否可测试?如果没有,我应该改变什么来使它成为可测试的并且保持b的初始化是通过对象a的方法,我作为我的类的构造函数的参数。
我想将我的对象(我在测试类中创建)将classB传递给Something类,问题是应该嘲笑某些东西并且对象a被模拟,所以我无法改变行为当a& thenReturn,当调用a.someLogicMethod时,它将返回我在测试类中创建的classB的对象,因为当Something被模拟时,将在a.someLogicMethod()之后调用when& thenReturn逻辑已被调用,b已设置。 我也不能为b对象设置一个setter,因为它应该用a.someLogicMethod()初始化。 我需要嘲笑某事的原因是因为我希望对象d会被嘲笑。
感谢。
答案 0 :(得分:1)
您正在向Apps
注入A
,因此只需模拟Something
,然后在调用A
时让A
返回模拟的B
。
例如:
someLogicMethod()
然后,您可以在测试用例中调用A mockA = Mockito.mock(A.class);
B mockB = Mockito.mock(B.class);
Mockito.when(a.someLogicMethod()).thenReturn(mockB);
Something something = new Something(mockA);
,这样您就可以通过使用when / then或when / throw或doThrow /设置对something
的期望来控制something
的行为等等。
答案 1 :(得分:0)
这里有两个方面:
您的构造函数是测试友好的,因为您传递 A
的实例。因此,正如其他答案所概述的那样,您应该能够将模拟的实例传递给该构造函数 - 从而导致您完全控制以下方法调用的操作
关于@autowired:这里的答案是转而使用特殊的春天JUnit跑步者(请参阅here获取所有荣耀细节)