【问题标题】:Mockito on ClassA, mock modifying state of ClassBClassA 上的 Mockito,模拟 ClassB 的修改状态
【发布时间】:2021-02-17 21:55:50
【问题描述】:

我有一个对象 AClazz,其中包含另一个对象 BClazz。当在 AClazz 上调用方法时,它会模拟更改 BClazz 的状态。

class AClazz(){
  BClazz b;
  public void begin(){
     b.start();
  }
}

class BClazz{
  private boolean running = false;

  public void start(){
         running = true;
  }
  public boolean isRunning(){
        return running;
   }
}

我想在 AClazz 类上编写单元测试 - 以测试当 begin() 被调用时,BClazz 的状态被相应地设置。 BClazz 实际上不应该被调用,但是方法 isRunning() 的行为会被模拟

  AClazz a;
  BClazz b; 
  // inject b into a

  // Mockito.when(a.begin( (//should invoke b.start())) ) such that b.isRunning() returns true

有什么办法吗?

【问题讨论】:

    标签: java unit-testing dependency-injection mockito


    【解决方案1】:

    使用 BClazz 模拟的 AClazz 测试可以验证,当您调用 a.begin() 时,b.start() 已被调用。 b 是一个模拟,而不是真实的东西,所以我不知道是否可以进一步检查它(我认为你不应该,即使你可以)。

    然后可以编写 BClazz 中的测试来验证,当调用 b.start() 时,b.running 确实为真。这里不需要模拟。

    在这两个测试之间,您将涵盖所需的行为。根据良好的面向对象设计,AClazz 不需要知道 BClazz 在被告知启动时会做什么,因此没有理由在 AClazz 中编写测试来检查 b.running 的值。

    结果:良好的测试、良好的对象分离、良好的程序员 :)


    针对评论扩展答案:

    @Test
    void shouldTriggerCorrectResponseWhenBClazzStartReturnsTrue() {
      when(mockOfBClazz.start()).thenReturn(true);
      a.begin();
      // some code to assert that a has done the right thing
      // in response to a hypothetical 'true' result from mockOfBClazz
    }
    
    @Test
    void shouldTriggerCorrectResponseWhenBClazzStartReturnsFalse() {
      when(mockOfBClazz.start()).thenReturn(false);
      a.begin();
      // some code to assert that a has done the right thing
      //in response to a hypothetical 'false' result from mockOfBClazz
    }
    

    您可以使用 when(mock.method()).thenReturn(response) 告诉您的测试类使用什么作为模拟类的返回值,因此您可以对测试每个边缘情况进行大量控制想想。

    【讨论】:

    • on 时的情况如何:在 ClazzA 上调用 method1,模拟行为以使 method2 返回 true。同样在ClassA上调用method2,method2返回false
    • 好问题!请参阅扩展答案,希望能涵盖它,但如果没有,请继续询问。
    猜你喜欢
    • 1970-01-01
    • 2020-01-19
    • 2021-02-19
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 2015-09-27
    相关资源
    最近更新 更多