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

Should I check for return value of collaborators in unit tests?

假设我关注 classes:

class A {
 private B b;
 private int milkQuantity;

 A(B b) {
  this.b = b;
 }

 public getCoffee() {
  milkQuantity = b.getMilk(1);

  return secretRecipe();    
 }

 ...
}

所以,在进行单元测试时,我应该模拟 class B 并检查是否调用了 getMilk() 方法,或者我应该检查它 returns 是否正确的牛奶数量(即 1 杯)?对于后一种情况,我需要在单元测试中设置 class B

根据我的说法,我们需要在自己的单元测试中检查 class B 的行为,只有在正确的方法是 class A 时才应该关注叫不叫。

更新 1

让我的观点更清楚:

在调用 a.getCoffee() 时我应该测试:

assertThat(a.milkQuantity).isEqualTo(1);

verify(b).getMilk();

编写 unit 测试时,您需要在自己的测试中处理每个单元(通常是 class)。所以 B 需要自己的测试,而 A 需要使用 B 的模拟实例进行测试,以测试它是否正确使用它。你不需要检查 getMilk 的 return 值(毕竟 - 你在嘲笑它),但你需要检查 B 是否正确使用它 - 即secretRecipe 正在使用相同的值调用 getMilk returned.

理想情况下,您希望测试 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())