3

假设我有一个Foo带有方法的接口bar(String s)。我唯一想嘲笑的是bar("test");.

我不能用静态部分模拟来做到这一点,因为我只希望在bar传递“测试”参数时模拟该方法。我不能用动态部分模拟来做到这一点,因为这是一个接口,我也不希望模拟实现构造函数。我也不能使用接口模拟MockUp,因为我无法注入模拟实例,它是在代码中的某处创建的。

有什么我想念的吗?

4

2 回答 2

7
final Foo foo = new MockUp<Foo>() {
        @Mock
        public bar(String s)(){
        return "test";
        }
    }.getMockInstance();
foo.bar("") will now retun "test"...
于 2013-05-31T16:50:49.210 回答
2

实际上,对于这种情况,您需要动态模拟实现所需接口的类。@Capturing但是JMockit 目前不支持这种组合( + 动态模拟)。

也就是说,如果实现类是已知的并且可用于测试代码,则可以单独使用动态模拟来完成,如以下示例测试所示:

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
}
于 2013-03-04T16:10:29.187 回答