代码之家  ›  专栏  ›  技术社区  ›  Bas

单元测试什么也不返回,如何断言?

  •  2
  • Bas  · 技术社区  · 14 年前

    如何断言这样的代码?最好的方法是什么?

    public void doSomething(int myProperty){
        if (myProperty == 0) return;
        // If myProperty is not zero, do something in the method
    }
    
    6 回复  |  直到 14 年前
        1
  •  3
  •   AakashM    14 年前

    你可以断言 return 发生在 myProperty 是零。

    例如,如果方法是(伪代码!)

    if myProperty == 0 return
    
    myOtherProperty = 2
    

    那么你的单元测试可以

    • 安排 那个 我的财产 设置为零, myOtherProperty 设置为除 2
    • 行为 通过调用测试中的方法
    • 断言 那个 肌热学性质 仍然设置为它以前设置的值。
        2
  •  7
  •   mouviciel    14 年前

    如果这段代码什么也不返回,它的目的是什么?如果你删除这条线会有什么问题?

    如果您找到了这些问题的有价值的答案,您将找到测试代码的提示。

    如果你找不到答案,那么你可以安全地删除这行代码(这样就没有测试可以写了)。

        3
  •  4
  •   Mark Seemann    14 年前

    不管你做什么,你都需要测试 可观测效应 . 你的方法肯定是可行的 某物 .

    使用时 基于状态的测试 ,您可以检查 SUT Fixture 在执行该方法以查看状态是否与您的期望匹配之后。

    如果不可行,您需要执行 Behavior Verification (阿卡 基于交互的测试 . 这通常是用 模拟对象 .

        4
  •  1
  •   topchef    14 年前

    我想马克·西曼给了你完整的答案——这只是一个例子。

    SomeVerifiableClass actor;
    
    public void doSomething(int myProperty){
        if (myProperty == 0) return;
    
        // If myProperty is not zero, do something in the method
        actor.doesSomething(myProperty);
    }
    

    那么你的选择就是嘲笑 某个可验证类 或者用真实的测试。如果您正确地使用DI,那么模拟是一个更好的选择。

    模拟:验证行为(伪代码):

      verify(mockedActor).noMethodsCalled();
    

    对于真实对象,验证状态:

      assert(isPrestine(actor));
    

    如果在您的案例中没有参与者,那么您应该能够验证被测试对象(执行的对象)的状态 剂量测定法 )

        5
  •  0
  •   BrianB    14 年前

    当我看到这一点时,我问的问题是:当MyProperty不是零时会发生什么?

    此返回后是否有更改类级别/共享状态的代码?您能否针对类级/共享状态断言以验证行为?

    当MyProperty为零时,则状态不受该方法的影响。

        6
  •  0
  •   mamoo    14 年前

    您没有发布方法签名,所以我认为它的返回类型为void。在这种情况下,没有办法像您所指出的那样测试它;但是如果方法与对象范围属性交互,您可以测试它们以查看它们是否更改。