我应该在单元测试中检查协作者的 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())
假设我关注 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())