【问题标题】:Should I check the state of objects returned by methods I am testing我应该检查我正在测试的方法返回的对象的状态吗
【发布时间】:2014-10-02 12:27:01
【问题描述】:

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

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

还是我检查返回的对象不够空?

【问题讨论】:

  • 我想您需要在某个地方检查是否正在生产正确的订单。这可以通过测试返回的对象来实现,也可以是其他方法。很难就这样一个广泛而笼统的问题提出建议。
  • 如果你给我们一些上下文,/其他验证/你对对象做什么,这可能会有所帮助。这里有很多可能的答案

标签: java unit-testing


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    假设你的方法是这样做的:

    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 方法的功能用途。

    【讨论】:

      猜你喜欢
      • 2016-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多