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