我应该检查我正在测试的方法返回的对象的状态

时间:2014-10-02 12:27:02

标签: java unit-testing

我正在为我的服务层编写单元测试。我有一个名为placeOrder的方法,它返回一个Order对象。我有一个单元测试,检查返回的Order对象是否为空。

我是否还要检查返回对象的状态以确保placeOrder方法已正确设置?例如,检查订单日期,订单行数,放置它的用户。

或者我检查返回的对象是否足够空?

2 个答案:

答案 0 :(得分:0)

我使用方法生成我的代码。如果我正在测试一个方法,我的测试用例会检查 all 方法的后置条件(包括不变量),这些条件可以简单地根据方法的参数,状态来表示。方法调用之前的对象和方法调用之后的对象的状态。

为什么呢?因为我无法预测哪些后置条件或不变量可能会因错误的重构或增强而被破坏,所以我必须对它们进行全部或几乎全部测试。

相反,如果返回对象的字段不是后置条件的一部分,我倾向于不在测试中检查它的值,除非我知道我必须检查它以确保正确操作方法。我怎么知道那些是哪个领域?我也使用方法;如果最低要求更改到开发中的代码以使其通过现有的测试集是不是都设置了一些字段值,我故意不设置这些字段,并添加到我的TODO列表测试 - 检查那些字段是否正确设置的大小写(或案例)。

答案 1 :(得分:0)

恕我直言,这取决于方法的目的是什么 - 填充对象的成员或仅返回已填充(从其他地方)对象。

假设您的方法执行此操作:

public Order placeOrder() {
    Order order = new Order();
    order.setUser("John Smith");
    //more members are set...
    return order;
}

在这种情况下,显然,方法的目的是填充order的成员,然后返回对象。在这种情况下,您的单元测试必须确保返回的对象已填充(全部)其成员,例如

@Test
public void testPlaceOrder() {
    Order order = myServiceInstance.placeOrder();
    assertNotNull(order);
    assertNotNull(order.getUser());
    //more assertions
}

另一种情况是placeOrder方法只是返回已填充对象的情况。例如:

public Order placeOrder(Order order) {
    someExternalMethodThatPopulatesTheOrder(order);
    return order;
}

在这种情况下,您的单元测试应该只测试placeOrder方法的功能,如果someExternalMethodThatPopulatesTheOrder() 正常工作,则不应该这样。鉴于此,您可以模拟 someExternalMethodThatPopulatesTheOrder()的功能(使用PowerMock或Mockito等库),以便您可以测试placeOrder方法的功能目的。