- 根据参数动态返回不同数据(定制返回)
参考:https://stackoverflow.com/questions/36983140/jmockit-expectations-api-return-input-parameters
@SuppressWarnings("unused")
@Test
public void verifySameStringReturnedWithExpectationsAPI(@Mocked Duplicator dup) throws Exception {
new Expectations() {{
dup.duplicate(anyString);
result = new Delegate<String>() { String delegate(String str) { return str; }};
}};
assertEquals("test", dup.duplicate("test"));
assertEquals("delegate did it", dup.duplicate("delegate did it"));
}
重点:
result = new Delegate<String>() {
String delegate(String str) {
return str;
}
};
方案:定义一个代理类。
官方文档:
http://jmockit.github.io/tutorial/Mocking.html
一个例子:
@Tested
CodeUnderTest cut;
@Test
public void delegatingInvocationsToACustomDelegate(@Mocked DependencyAbc anyAbc) {
new Expectations() {{
anyAbc.intReturningMethod(anyInt, anyString);
result = new Delegate() {
int aDelegateMethod(int i, String s) {
return i == 1 ? i : s.length();
}
};
}};
// Calls to "intReturningMethod(int, String)" will execute the delegate method above.
cut.doSomething();
}
Delegate接口是一个空接口,只是用来告诉JMockit在重放(replay)的时候,实际的调用应该调用这个接口里面定义的代理方法。
这个方法只要是唯一的方法,非private方法即可,可以是任意名字。
方法的参数:
有两种情况:1、无参数;2、匹配被记录的(也就是被mock)那个方法的参数;
此外,方法可以有一个Invocation类型的参数作为第一个参数。可以通过这个参数获取到被调用的实例。
方法的返回值:不需要跟被记录的方法一样。但是需要是可匹配的,不然运行的时候产生ClassCastException错误。
构造函数也可以利用这个Deleate接口。示例展示了一个构造函数被代理给一个某种条件下会抛出异常的代理方法。
@Test
public void delegatingConstructorInvocations(@Mocked Collaborator anyCollaboratorInstance) {
new Expectations() {{
new Collaborator(anyInt);
result = new Delegate() {
void delegate(int i) { if (i < 1) throw new IllegalArgumentException(); }
};
}};
// The first instantiation using "Collaborator(int)" will execute the delegate above.
new Collaborator(4);
}