Java 具有复杂对象依赖关系的单元测试
我需要对几个方法进行单元测试,类似于下面的方法。类ProductItem非常复杂,并且是嵌套的。测试此方法的一种方法是,我花时间为ProductItem构建一个对象并将其传递给该方法,但我觉得这太单调乏味了。在不构建整个对象的情况下,有什么好的方法来测试它吗Java 具有复杂对象依赖关系的单元测试,java,unit-testing,Java,Unit Testing,我需要对几个方法进行单元测试,类似于下面的方法。类ProductItem非常复杂,并且是嵌套的。测试此方法的一种方法是,我花时间为ProductItem构建一个对象并将其传递给该方法,但我觉得这太单调乏味了。在不构建整个对象的情况下,有什么好的方法来测试它吗 public BigDecimal getSubtotal(ProductItem ip) { return ip.getTotal().subtract(ip.getTotalTax()) .subtrac
public BigDecimal getSubtotal(ProductItem ip) {
return ip.getTotal().subtract(ip.getTotalTax())
.subtract(ip.getShipping());
}
您可以使用Mockito之类的模拟库。例如:
final ProductItem mock = mock(ProductItem.class);
when(mock.getTotal()).thenReturn(something);
// same for .getTotalTax(), .getShipping()
然后可以测试.getSubtotal()
方法:
// Using BigDecimal's .compareTo() for reliable results...
// "0" and "0.0" are not .equals() with BigDecimal!
assertTrue(xxx.getSubtotal(mock).compareTo(expectedResult) == 0);
请注意,不以这种方式存根的方法将返回默认值:原语为0,对象为null,布尔值为false
注2:要求ProductItem
不是final
,并且存根方法也不是final
;否则,您将不得不使用PowerMockito,还必须编写一些胶水
注3:也适用于抽象类和接口;您可以
mock(Comparator.class)
例如为什么我们在这里使用final进行模拟?不确定您在这里称之为状态测试吗?@user3123690至于final
,这是我的编码风格,没有其他;)如果你看第2.3节,它提到了状态测试。