其他分享
首页 > 其他分享> > 使用JMockit,如何模拟特定输入参数值的接口方法?

使用JMockit,如何模拟特定输入参数值的接口方法?

作者:互联网

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

我不能用静态部分模拟来做,因为我只想在传递“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
}

标签:java,unit-testing,junit,jmockit
来源: https://codeday.me/bug/20190723/1510313.html