假设我们有一个接口,它有两个方法:
public interface MyInterface {
public SomeType first();
public SomeType second();
}
该接口由MyInterfaceImpl
. 在实现内部,first()
调用second()
检索一些结果。
我想构建一个单元测试,它将first()
根据来自的内容断言来自的事物second()
,类似于:
1 public class MyInterfaceTest {
2 private MyInterface impl = new MyInterfaceImpl();
4 @Test
5 public void testFirst() {
6 // modify behaviour of .second()
7 impl.first();
8 assertSomething(...);
10 // modify behaviour of .second()
11 impl.first();
12 assertSomethingElse(...);
13 }
14 }
是否有一种简单的方法可以在线创建模拟,以便直接调用(委托给)2
对选定方法(例如)的所有调用,而将其他一些方法(例如)替换为模拟对应物?first()
MyInterfaceImpl
second()
对于静态方法,这实际上很容易使用 PowerMock 实现,但对于动态方法,我需要类似的东西。
解决方案基于
MyInterface mock = EasyMock.createMock(MyInterface.class);
MyInterface real = new MyInterfaceImpl();
EasyMock.expect(mock.first()).andReturn(real.first()).anyTimes();
EasyMock.expect(mock.second()).andReturn(_somethingCustom_).anyTimes();
还不够好,尤其是对于具有大量方法(大量样板文件)的接口。我需要转发行为,因为real
实际上取决于其他模拟。
我希望这样的事情由框架处理,而不是由我自己的班级处理。这是可以实现的吗?