2016-03-04 21 views
2

想我下面的类:我应该在单元测试中检查协作者的回报值吗?

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

OR

verify(b).getMilk(); 
+1

东西,如果你正在测试'A',你只需要检查'A'是做什么它应该。如果你正在测试'B',你需要检查'B'正在做它应该做的事情。 – khelwood

回答

2

在编写单元测试时,您需要在自己的测试中处理每个单元(通常是一个类)。 SO B需要自己的测试,并且A需要使用B的模拟实例进行测试以测试其正确使用它。你并不需要检查getMilk的返回值(毕竟 - 你嘲笑的话),但你需要检查B正确地使用它 - 即是secretRecipe被称为具有相同的值getMilk返回。

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()) 
相关问题