通常,当使用嘲笑我会做类似
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"); }
这是一种方法。这使用一个Answer对象来检查属性的值。
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方法-测试类的其余部分应与上述相同。
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()); }