通常在使用Mockito时,我会执行以下操作:
Mockito.when(myObject.myFunction(myParameter)).thenReturn(myResult);
有没有可能做一些类似的事情
myParameter.setProperty("value");
Mockito.when(myObject.myFunction(myParameter)).thenReturn("myResult");
myParameter.setProperty("otherValue");
Mockito.when(myObject.myFunction(myParameter)).thenReturn("otherResult");
因此,不是在仅仅使用参数来确定结果时,而是在使用参数内部的属性值来确定结果。
因此,当执行代码时,它的行为如下:
public void myTestMethod(MyParameter myParameter,MyObject myObject){
myParameter.setProperty("value");
System.out.println(myObject.myFunction(myParameter));// outputs myResult
myParameter.setProperty("otherValue");
System.out.println(myObject.myFunction(myParameter));// outputs otherResult
}
这是目前的解决方案,希望能提出更好的建议。
private class MyObjectMatcher extends ArgumentMatcher<MyObject> {
private final String compareValue;
public ApplicationContextMatcher(String compareValue) {
this.compareValue= compareValue;
}
@Override
public boolean matches(Object argument) {
MyObject item= (MyObject) argument;
if(compareValue!= null){
if (item != null) {
return compareValue.equals(item.getMyParameter());
}
}else {
return item == null || item.getMyParameter() == null;
}
return false;
}
}
public void initMock(MyObject myObject){
MyObjectMatcher valueMatcher = new MyObjectMatcher("value");
MyObjectMatcher otherValueMatcher = new MyObjectMatcher("otherValue");
Mockito.when(myObject.myFunction(Matchers.argThat(valueMatcher))).thenReturn("myResult");
Mockito.when(myObject.myFunction(Matchers.argThat(otherValueMatcher))).thenReturn("otherResult");
}
5条答案
按热度按时间vxf3dgd41#
在Java 8中,它甚至比上述所有内容都要简单:
jvlzgdj92#
这里有一种方法,它使用
Answer
对象来检查属性的值。还有一种语法,我更喜欢,它能达到同样的效果。请你选择其中的一种。这只是
setUp
方法-测试类的其余部分应该和上面的一样。3z6pesqy3#
是的,您可以使用自定义参数匹配器。
有关详细信息,请参阅the javadoc of
Matchers
,更具体地说,请参阅ArgumentMatcher
。kyvafyod4#
下面是它在Kotlin中使用mockito-kotlin库时的样子。
lfapxunr5#
您可以使用Mockito 3.6.0来实现这一点:
此答案基于Sven's answer和Martijn Hiemstra的评论,将
getArgumentAt()
更改为getArgument()
。