【问题标题】:Tests repeats the code with Mockito测试用 Mockito 重复代码
【发布时间】:2015-03-06 13:51:20
【问题描述】:

我的测试只是重复代码。对于方法

public void start(Context context) {
    context.setA(CONST_A);
    context.setB(CONST_B);
    ...
}

我使用 Mockito 编写了测试

@Test
public void testStart() throws Exception {
    Context mockContext = mock(Context.class);

    action.start(mockContext);

    verify(mockAction).setA(Action.CONST_A);
    verify(mockAction).setB(Action.CONST_B);
    ...
}

或者对于

public void act() {
   state.act();
}

测试

@Test
public void testAct() throws Exception {
    State mockState = mock(State.class);
    context.setState(mockState);

    context.act();

    verify(mockState).act();
}

这样的测试有用吗?这类方法需要测试,如何测试?

【问题讨论】:

    标签: java unit-testing junit mocking mockito


    【解决方案1】:

    在我看来,一般来说,您不应该尝试 100% 的测试覆盖率。拥有高测试覆盖率是好的,拥有完美覆盖率是无用的,而且会浪费您的时间。任何只是设置、获取或委托给另一个方法的方法都不应该被测试,因为它会花费你很多的编写成本,甚至在重构时会花费更多。最后,它不会为使用您的 API 的任何人增加更多的反回归价值或任何帮助。

    更喜欢具有真实智能、风险或敏感的测试方法。您提交的案例比您自己的代码测试更多的 Mockito。这将花费构建时间并且对您没有帮助。

    【讨论】:

    • 如果在团队中工作,严格的 100% 覆盖率可以避免成员因为将测试方法判断为原始方法而错过测试。但是我同意(与你和 Doni 一样)不应该使用 verify 进行测试,因为你只重复要测试的代码。
    • 我同意你的看法。 “测试方法契约,而不是它的实现”。
    【解决方案2】:

    我个人认为verify() 一点用都没有,因为它直接测试实现而不是您的方法的结果。当您在结果仍然正确的情况下更改实现时,这会给您带来错误的失败。

    关于这是否有用:没有逻辑可以测试所以没有,它不是特别有用。

    【讨论】:

    • 根据 Bob Martin 的模拟行为(即使用验证)是脆弱的。更好的方法应该基于数据进行测试。
    【解决方案3】:

    根据我在其他答案中留下的cmets

    public void start(Context context) {
      context.setA(CONST_A);
      context.setB(CONST_B);
      ...
    }
    

    不应使用 Mockito 进行测试,而是

    @Test
    public void testStart() throws Exception {
       Context context = new Context();
    
       action.start(context);
    
       assertThat(context.getA(), equalTo(Action.CONST_A));
       assertThat(context.getB(), equalTo(Action.CONST_B));
    }
    

    它并没有太大的不同,但与 verify 相比,它也可以为 true,如果 start 设法达到这个状态而不调用 setter 或 getter。

    【讨论】:

      猜你喜欢
      • 2017-02-25
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      • 2016-04-22
      • 2011-04-17
      • 1970-01-01
      相关资源
      最近更新 更多