假设我有一个方法Foo
的接口bar(String s)
。我唯一想要嘲笑的是bar("test");
。
我不能用静态部分模拟来做,因为我只想在传递“test”参数时模拟bar
方法。我不能用动态部分模拟来做,因为这是一个接口,我也不希望实现构造函数被模拟。我也不能使用MockUp
的界面模拟,因为我无法注入模拟实例,它是在代码中的某处创建的。
我有什么遗失的吗?
答案 0 :(得分:7)
final Foo foo = new MockUp<Foo>() {
@Mock
public bar(String s)(){
return "test";
}
}.getMockInstance();
foo.bar("") will now retun "test"...
答案 1 :(得分:2)
实际上,对于这种情况,您需要动态模拟实现所需接口的类。但是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
}