【发布时间】:2019-08-17 02:00:57
【问题描述】:
我可以自动将所有调用委托给共享同一接口的另一个实例的方法吗?
我有一个像这样的大课(我想测试):
class MyClassUnderTest implements SomeInterface {
public void anImportantMethod() {
}
@Override
public void fromTheInterface() {
}
@Override
public void fromTheInterface2() {
}
private void utilFunc() {}
}
它实现了一个接口
interface SomeInterface {
void fromTheInterface();
void fromTheInterface2();
}
鉴于此,在单元测试期间,我想“隐藏”从具有不同实现的接口继承的方法。为此,我编写了一个实用程序类
class DebugSomeInterface implements SomeInterface {
@Override public void fromTheInterface() { log.debug("1"); }
@Override public void fromTheInterface2() { log.debug("2"); };
}
现在我需要将所有可能的调用“委托”给该实现。我通过派生自 MyClassUnderTest 我自己的类来手动完成此操作,并将所有调用委托给该类:
class MyClassUnderTest_Mock extends MyClassUnderTest {
DebugSomeInterface delegated = new DebugSomeInterface();
@Override public void fromTheInterface() {
delegated.fromTheInterface();
}
@Override public void fromTheInterface2() {
delegated.fromTheInterface2();
};
只是,我有很多实现SomeInterface 的类,而手动执行此操作既乏味又容易出错。
我想要一种(半)自动化的方式来创建 MyClassUnderTest_Mock 实例,就像使用 Mockito 的 mock(...) 一样。也许像
MyClassUnderTest underTest = new MyClassUnderTest();
DebugSomeInterface delegated = new DebugSomeInterface();
MyClassUnderTest instance = mixin(underTest, SomeInterface.class, delegated);
这可能会创建一个“代理”instance,它将所有方法调用从 SomeInterface 委托给 delegated,其余的委托给 underTest。
在核心 Java 中有一些代理对象机制,但我无法将它们全部结合在一起。
【问题讨论】:
-
你可以 spy(new MyClassUnderTest()) 然后模拟出你想要提供行为的方法
标签: java unit-testing proxy mockito delegation