通常在使用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");
}
答案 0 :(得分:38)
在Java 8中,它甚至比上述所有内容更简单:
when(mockObject.myMethod(anyString()))
.thenAnswer(invocation ->
invocation.getArgumentAt(0, String.class));
答案 1 :(得分:31)
这是一种做法。这使用Answer
对象来检查属性的值。
@RunWith(MockitoJUnitRunner.class)
public class MyTestClass {
private String theProperty;
@Mock private MyClass mockObject;
@Before
public void setUp() {
when(mockObject.myMethod(anyString())).thenAnswer(
new Answer<String>(){
@Override
public String answer(InvocationOnMock invocation){
if ("value".equals(theProperty)){
return "result";
}
else if("otherValue".equals(theProperty)) {
return "otherResult";
}
return theProperty;
}});
}
}
有一种替代语法,我实际上更喜欢它,它将实现完全相同的东西。在你的选择中选择哪一个。这只是setUp
方法 - 测试类的其余部分应与上面相同。
@Before
public void setUp() {
doAnswer(new Answer<String>(){
@Override
public String answer(InvocationOnMock invocation){
if ("value".equals(theProperty)){
return "result";
}
else if("otherValue".equals(theProperty)) {
return "otherResult";
}
return theProperty;
}}).when(mockObject).myMethod(anyString());
}
答案 2 :(得分:6)
是的,您可以使用自定义参数匹配器。
有关详情,请参阅the javadoc of Matchers
,更具体地说,请ArgumentMatcher
。
答案 3 :(得分:0)
以下是使用mockito-kotlin库在Kotlin中的样子。
mock<Resources> {
on {
mockObject.myMethod(any())
} doAnswer {
"Here is the value: ${it.arguments[0]}"
}
}
答案 4 :(得分:0)
您可以使用Mockito 3.6.0做到这一点:
when(mockObject.myMethod(anyString()))
.thenAnswer(invocation -> myStringMethod(invocation.getArgument(0)));
此答案基于Sven's answer和Martijn Hiemstra的评论,其中getArgumentAt()
更改为getArgument()
。