Mockito ArgumentMatcher 任何对象[]
Mockito ArgumentMatcher any Object[]
我需要一个 ArgumentMatcher 来接受对象数组 (Object[]) 中的任何类型的值。
测试对象:
class ObjectArrayMethod {
public int call(Object... objects) {
return 0;
}
}
我尝试了这些,其中所有 assertEquals 都失败了:
ObjectArrayMethod method = Mockito.mock(ObjectArrayMethod.class);
Object[] arg = {"", ""};
Mockito.when(method.call(AdditionalMatchers.aryEq(arg))).thenReturn(15);
int actual = method.call(arg);
assertEquals(15, actual);
ObjectArrayMethod method = Mockito.mock(ObjectArrayMethod.class);
Mockito.when(method.call(any(Object[].class))).thenReturn(15);
Object[] arg = new Object[] {null, null};
int actual = method.call(arg);
assertEquals(15, actual);
甚至失败:
ObjectArrayMethod method = Mockito.mock(ObjectArrayMethod.class);
Object[] arg = {"", ""};
Mockito.when(method.call(AdditionalMatchers.aryEq(arg))).thenReturn(15);
int actual = method.call(arg);
assertEquals(15, actual);
我写了一个自己的匹配器:
protected static class ObjectArrayArgumentMatcher implements ArgumentMatcher<Object[]>, VarargMatcher {
private static final long serialVersionUID = 3846783742617041128L;
private final Object[] values;
private ErrorState errorState = NO_ERROR;
protected ObjectArrayArgumentMatcher(Object[] values) {
this.values = values;
}
@Override
public boolean matches(Object[] argument) {
if (values == null) {
return true;
}
if (argument == null) {
return false;
}
return true;
}
}
和
protected static class ObjectArrayArgumentMatcher2 extends ObjectArrayArgumentMatcher {
private static final long serialVersionUID = 3085412884910289910L;
protected ObjectArrayArgumentMatcher2(Object... values) {
super(values);
}
@Override
public boolean matches(Object... argument) {
return super.matches(argument);
}
}
我用空值初始化的。但是我没有被叫到。
当然,下一步是比较参数。
为什么调用更近的 matches(Object[] argument) 和 matches(Object... argument),args {"", ""} 甚至 {null, null}?
我需要的是一个 ArgumentMatcher,它适用于任何对象数组,即使是像 {"String", 1, new Object()} 这样的混合类型。
我最后想mock的方法是
int org.springframework.jdbc.core.JdbcTemplate.update(String sql, Object... args) throws DataAccessException
我正在使用
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.22.0</version>
顺便说一句。使用版本 1.10.19 我的 ObjectArrayArgumentMatcher 工作。
最后这个 post 帮我解决了这个问题:
How to properly match varargs in Mockito
这个有效:
Mockito.when(method.call(ArgumentMatchers.<Object>any())).thenReturn(10);
我需要一个 ArgumentMatcher 来接受对象数组 (Object[]) 中的任何类型的值。 测试对象:
class ObjectArrayMethod {
public int call(Object... objects) {
return 0;
}
}
我尝试了这些,其中所有 assertEquals 都失败了:
ObjectArrayMethod method = Mockito.mock(ObjectArrayMethod.class);
Object[] arg = {"", ""};
Mockito.when(method.call(AdditionalMatchers.aryEq(arg))).thenReturn(15);
int actual = method.call(arg);
assertEquals(15, actual);
ObjectArrayMethod method = Mockito.mock(ObjectArrayMethod.class);
Mockito.when(method.call(any(Object[].class))).thenReturn(15);
Object[] arg = new Object[] {null, null};
int actual = method.call(arg);
assertEquals(15, actual);
甚至失败:
ObjectArrayMethod method = Mockito.mock(ObjectArrayMethod.class);
Object[] arg = {"", ""};
Mockito.when(method.call(AdditionalMatchers.aryEq(arg))).thenReturn(15);
int actual = method.call(arg);
assertEquals(15, actual);
我写了一个自己的匹配器:
protected static class ObjectArrayArgumentMatcher implements ArgumentMatcher<Object[]>, VarargMatcher {
private static final long serialVersionUID = 3846783742617041128L;
private final Object[] values;
private ErrorState errorState = NO_ERROR;
protected ObjectArrayArgumentMatcher(Object[] values) {
this.values = values;
}
@Override
public boolean matches(Object[] argument) {
if (values == null) {
return true;
}
if (argument == null) {
return false;
}
return true;
}
}
和
protected static class ObjectArrayArgumentMatcher2 extends ObjectArrayArgumentMatcher {
private static final long serialVersionUID = 3085412884910289910L;
protected ObjectArrayArgumentMatcher2(Object... values) {
super(values);
}
@Override
public boolean matches(Object... argument) {
return super.matches(argument);
}
}
我用空值初始化的。但是我没有被叫到。
当然,下一步是比较参数。
为什么调用更近的 matches(Object[] argument) 和 matches(Object... argument),args {"", ""} 甚至 {null, null}?
我需要的是一个 ArgumentMatcher,它适用于任何对象数组,即使是像 {"String", 1, new Object()} 这样的混合类型。
我最后想mock的方法是
int org.springframework.jdbc.core.JdbcTemplate.update(String sql, Object... args) throws DataAccessException
我正在使用
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.22.0</version>
顺便说一句。使用版本 1.10.19 我的 ObjectArrayArgumentMatcher 工作。
最后这个 post 帮我解决了这个问题: How to properly match varargs in Mockito
这个有效:
Mockito.when(method.call(ArgumentMatchers.<Object>any())).thenReturn(10);