Java 具有复杂对象依赖关系的单元测试

Java 具有复杂对象依赖关系的单元测试,java,unit-testing,Java,Unit Testing,我需要对几个方法进行单元测试,类似于下面的方法。类ProductItem非常复杂,并且是嵌套的。测试此方法的一种方法是,我花时间为ProductItem构建一个对象并将其传递给该方法,但我觉得这太单调乏味了。在不构建整个对象的情况下,有什么好的方法来测试它吗 public BigDecimal getSubtotal(ProductItem ip) { return ip.getTotal().subtract(ip.getTotalTax()) .subtrac

我需要对几个方法进行单元测试,类似于下面的方法。类ProductItem非常复杂,并且是嵌套的。测试此方法的一种方法是,我花时间为ProductItem构建一个对象并将其传递给该方法,但我觉得这太单调乏味了。在不构建整个对象的情况下,有什么好的方法来测试它吗

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节,它提到了状态测试。