我应该在单元测试中检查协作者的返回值吗?

时间:2016-03-04 11:33:14

标签: java unit-testing tdd

假设我关注以下课程:

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();

2 个答案:

答案 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())