使用JMockit,我如何模拟特定输入参数值的接口方法?
比方说,我有一个接口Foo
与方法bar(String s)
。我唯一想嘲笑的是bar("test");
。使用JMockit,我如何模拟特定输入参数值的接口方法?
我不能用静态部分模拟来实现,因为我只想在传递“test”参数的时候模拟bar
方法。我不能用动态部分模拟来实现,因为这是一个接口,我也不希望实现构造函数被模拟。我也不能用MockUp
来模拟界面,因为我没有注入模拟实例的能力,它是在代码中创建的。
有什么我失踪?
确实,对于这种情况,您需要动态地模拟实现所需接口的类。但是JMockit目前不支持这种组合(@Capturing
+动态模拟)。
也就是说,如果实现类是已知的,可访问的测试代码,那么就可以用单独的动态嘲弄的完成,如下面的示例测试表明:
public interface Foo {
int getValue();
String bar(String s);
}
static final class FooImpl implements Foo {
private final int value;
FooImpl(int value) { this.value = value; }
public int getValue() { return value; }
public String bar(String s) { return s; }
}
@Test
public void dynamicallyMockingAllInstancesOfAClass()
{
final Foo exampleOfFoo = new FooImpl(0);
new NonStrictExpectations(FooImpl.class) {{
exampleOfFoo.bar("test"); result = "aBcc";
}};
Foo newFoo = new FooImpl(123);
assertEquals(123, newFoo.getValue());
assertEquals("aBcc", newFoo.bar("test")); // mocked
assertEquals("real one", newFoo.bar("real one")); // not mocked
}
我能用MockUp + if-else检查输入参数来实现它。无论如何,感谢您的回复!如果对exampleOfFoo.bar(“not_test”)的调用将以exampleOfFoo.bar(“test”)结束堆栈,该解决方案将如何工作?模拟或原始方法会被调用吗? – Marcin 2013-03-04 17:55:34
记录的结果“aBcc”将返回。 (至少如果使用最新版本的JMockit。) – 2013-03-04 19:01:14
final Foo foo = new MockUp<Foo>() {
@Mock
public bar(String s)(){
return "test";
}
}.getMockInstance();
foo.bar("") will now retun "test"...
如何富创造的呢?示例代码会很好。 – 2013-03-04 12:00:35
有什么我不明白的吗?为什么'Foo foo = mock(FooImpl.class);当(foo.bar( “测试”))thenReturn( “嘲笑”); when(foo.bar(anyString()))。thenCallRealMethod()'不适合你。编辑:我刚开始并没有看到你在使用JMockit。 – Alex 2013-03-04 12:01:02