2013-03-04 27 views
3

比方说,我有一个接口Foo与方法bar(String s)。我唯一想嘲笑的是bar("test");使用JMockit,我如何模拟特定输入参数值的接口方法?

我不能用静态部分模拟来实现,因为我只想在传递“test”参数的时候模拟bar方法。我不能用动态部分模拟来实现,因为这是一个接口,我也不希望实现构造函数被模拟。我也不能用MockUp来模拟界面,因为我没有注入模拟实例的能力,它是在代码中创建的。

有什么我失踪?

+0

如何富创造的呢?示例代码会很好。 – 2013-03-04 12:00:35

+0

有什么我不明白的吗?为什么'Foo foo = mock(FooImpl.class);当(foo.bar( “测试”))thenReturn( “嘲笑”); when(foo.bar(anyString()))。thenCallRealMethod()'不适合你。编辑:我刚开始并没有看到你在使用JMockit。 – Alex 2013-03-04 12:01:02

回答

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 
} 
+0

我能用MockUp + if-else检查输入参数来实现它。无论如何,感谢您的回复!如果对exampleOfFoo.bar(“not_test”)的调用将以exampleOfFoo.bar(“test”)结束堆栈,该解决方案将如何工作?模拟或原始方法会被调用吗? – Marcin 2013-03-04 17:55:34

+0

记录的结果“aBcc”将返回。 (至少如果使用最新版本的JMockit。) – 2013-03-04 19:01:14

7
final Foo foo = new MockUp<Foo>() { 
     @Mock 
     public bar(String s)(){ 
     return "test"; 
     } 
    }.getMockInstance(); 
foo.bar("") will now retun "test"... 
相关问题