正确使用Mockito进行JdbcOperation的方法

时间:2017-07-26 09:09:45

标签: junit mockito

我是Mockito的新手并试图涵盖以下源代码:

jdbcOperations.update(insertRoleQuery,new Object[]{"menuName","subMenuName","subSubMenuName","aa","bb","cc","role"});

在此查询中采用7个字符串参数。我已经为代码编写了mockito测试用例,它也包含了源代码,但我不确定它是否正确。

when(jdbcOperations.update(Mockito.anyString(), new Object[]{Mockito.anyString(),Mockito.anyString(),Mockito.anyString(),Mockito.anyString(),Mockito.anyString(),Mockito.anyString(),Mockito.anyString()})).thenThrow(runtimeException);

请建议我是否正确行事。

由于

1 个答案:

答案 0 :(得分:2)

根据the docs,您可以使用精确值或参数匹配器,但不能同时使用两者:

  

关于参数匹配器的警告:

     

如果您使用参数匹配器,则必须提供所有参数   由匹配者。

如果你混合它们,就像你的样本一样,mockito会抱怨类似于

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers!
2 matchers expected, 1 recorded:
-> at MyTest.shouldMatchArray(MyTest.java:38)

This exception may occur if matchers are combined with raw values:
    //incorrect:
    someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
    //correct:
    someMethod(anyObject(), eq("String by matcher"));

For more info see javadoc for Matchers class.

在您的情况下,您似乎并不关心数组内容,因此您只需使用any()

when(jdbcOperation.update(anyString(), any())).thenThrow(runtimeException);

如果您想至少检查参数的数量,可以使用

when(jdbcOperation.update(anyString(), argThat(array -> array.length == 7))).thenThrow(runtimeException);
when(jdbcOperation.update(anyString(), argThat(arrayWithSize(7)))).thenThrow(runtimeException);

如果您对匹配某些值感兴趣,可以使用AdditionalMatchers.aryEq(expectedArray),或只使用Mockito.eq(expectedArray)对数组有特殊实现,但我认为第一个表达了您的意图更清晰的方式。

when(jdbcOperation.update(anyString(), aryEq(new Object[]{"whatever"}))).thenThrow(runtimeException);