我是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);
请建议我是否正确行事。
由于
答案 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);