【问题标题】:How to mock the same method multiple times use mockito如何多次模拟相同的方法使用mockito
【发布时间】:2018-01-10 04:04:20
【问题描述】:

我有一个方法需要多次调用,在测试用例中可以返回相同的结果,我调用when使用for循环,但是有更简单的方法吗?

val ONE_DAY_FORMAT: SimpleDateFormat = SimpleDateFormat("yyyy-MM-dd")

val tempCalendar = Calendar.getInstance()
for (i in (0..15)) {
  `when`(accountingDao.sumOfDay(ONE_DAY_FORMAT.format(tempCalendar.time)))
      .thenReturn(100.0f)
   tempCalendar.add(Calendar.DAY_OF_YEAR, -1)
}

【问题讨论】:

  • 模拟一次就足够了,不需要循环。你想达到什么目的
  • 在 Java 中,我们有两种方式:1.doReturn(-1). doReturn(1). when(mockedObject). mockedMethod() 或 2.when(mockObject. mockedMethod()). thenReturn(-1, 1)。这两种方式都将在第一次调用中返回-1,在第二次调用中返回1。随后的调用抛出。我希望你能把它翻译成 kotlin。

标签: android kotlin mockito


【解决方案1】:

通常当设置比较复杂时,会使用doAnswer 策略:

   Mockito.doAnswer(new Answer<Float>() {
        @Override
        public Float answer(InvocationOnMock invocation) throws Throwable {
            String argument = (String)invocation.getArgument(0);

            if(supportedDates.contains(argument)){
                return 100.00f;
            }else{                  
                return null;
            }
        }
    }).when(accountingDao.sumOfDay(any(String.class)));

所以你基本上捕获输入参数,然后根据它的值决定应该动态返回什么。

【讨论】:

    【解决方案2】:

    不要模拟相同的方法,而是模拟一次方法并通过传递可选的验证模式参数来调用验证方法。例如,如果您希望模拟类的某些方法被调用两次,您可以像这样进行验证语句

    verify(mockedClass, Mockito.times(2)).someMethod();
    

    这将测试someMethod() 是否被调用了两次。

    【讨论】:

      【解决方案3】:

      将“when ...”语句移出循环:

      when`(accountingDao.sumOfDay(any()).thenReturn(100.0f)
      

      【讨论】:

      • 它适用于这种情况,但我实际上想要某些值而不是任何值。
      猜你喜欢
      • 2020-12-08
      • 2011-12-26
      • 2020-03-20
      • 2011-01-17
      • 1970-01-01
      相关资源
      最近更新 更多