这段代码可以测试吗?

时间:2017-11-17 07:52:09

标签: unit-testing testing mockito tdd

我们说我有一个构造函数:

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会被嘲笑。

感谢。

2 个答案:

答案 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获取所有荣耀细节)