假设我关注以下课程:
class A {
private B b;
private int milkQuantity;
A(B b) {
this.b = b;
}
public getCoffee() {
milkQuantity = b.getMilk(1);
return secretRecipe();
}
...
}
所以,虽然单元测试我应该模拟类B
并检查是否调用了getMilk()
方法,或者我应该检查它是否返回正确的牛奶量(即1杯)?对于后一种情况,我需要在单元测试中设置类B
。
根据我的说法,我们需要在自己的单元测试中检查类B
的行为,只有在调用了正确的方法时才应该关注类A
。
更新1
让我的观点更清楚:
我应该在调用a.getCoffee()
时:
assertThat(a.milkQuantity).isEqualTo(1);
或
verify(b).getMilk();
答案 0 :(得分:2)
在编写单元测试时,您需要在自己的测试中处理每个单元(通常是一个类)。 SO B
需要自己的测试,而A
需要使用模拟的B
实例进行测试,以测试其正确使用它。您不需要检查getMilk
的返回值(毕竟 - 您正在嘲笑它),但您确实需要检查B
是否正确使用它 - 即{{1}正在使用返回的相同值secretRecipe
调用。
答案 1 :(得分:1)
理想情况下,您需要测试getCoffee
的行为,而不是测试它的实现方式。也许将来你会以不同的方式实现它,但具有相同的行为,不应该破坏你的单元测试。所以我建议只测试getCoffee
的结果。模仿b.getMilk
很好。
测试时,我会建议做类似
的事情B b = new B() {
@Override
public int getMilk(int x){
// Mock implementation
}
}
A a = new A(b);
Coffee expected = ... // Manually construct a Coffee object with expected values
assertEquals(expected, a.getCoffee())