假设我有一个接口Foo,它的方法是bar(String s),我只想模拟bar("test");。我不能用静态部分模拟来做,因为我只想在传递“test”参数时模拟bar方法。我不能用动态部分模拟来做,因为这是一个接口,我也不想模拟实现构造函数。我也不能用MockUp来使用接口模拟,因为我没有能力注入模拟的示例,它是在代码中的某个地方创建的。我是不是漏掉了什么?
Foo
bar(String s)
bar("test");
bar
MockUp
neskvpey1#
Foo foo = new MockUp<Foo>() { @Mock public bar(String s)(){ return "test"; } }.getMockInstance();
foo.bar("")现在将返回"test" ...
foo.bar("")
"test"
pxy2qtax2#
实际上,在这种情况下,您需要动态模拟实现所需接口的类,但是JMockit目前不支持这种组合(@Capturing +动态模拟)。也就是说,如果实现类是已知的,并且测试代码可以访问它,那么它可以单独使用动态模拟来完成,如下面的示例测试所示:
@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 }
2条答案
按热度按时间neskvpey1#
foo.bar("")
现在将返回"test"
...pxy2qtax2#
实际上,在这种情况下,您需要动态模拟实现所需接口的类,但是JMockit目前不支持这种组合(
@Capturing
+动态模拟)。也就是说,如果实现类是已知的,并且测试代码可以访问它,那么它可以单独使用动态模拟来完成,如下面的示例测试所示: