次のような模擬セットアップがあるとします。
JUnit4Mockery context = new JUnit4Mockery();
MyInterface mock = context.mock(MyInterface.class);
そして後で、モックオブジェクトを調べて、モックしているクラスを見つけたいと思います:
Class mockedClass = mock.??? //would return MyInterface.class
これを行う方法について、JMock (2.5.1) javadocs で明らかなことは何も見当たりませんでした。mock
メソッドの署名は次のとおりです。
<T> T mock (Class<T> typeToMock)
以前のバージョン (私は 1.2.0 を見ました) では、Mock
オブジェクトを直接作成し、そのメソッドの 1 つが
Class getMockedType()
私が達成しようとしているのは、単体テスト内で DI を使用するための単体テスト フレームワークです。(私は Guice 3.0 を使用しています。) テストで DI を使用することは、私が使用しているアプリケーション サーバー/プラットフォームの制限です。私がテストしているオブジェクトは、独自の を持つ multiton のサブクラスですInjector
。移入しようとしています。
すべてのテストで AbstractModule の匿名インスタンスを作成する必要がないようにしたいので、次のようなものを構築しようとしています (これは 1.2 で機能していたようです)。
public class MockModule extends AbstractModule {
private Iterable<Mock> mocks;
public MockModule(Iterable<Mock> mocks) {
this.mocks = mocks;
}
protected void configure() {
for (Mock mock : mocks) {
bind(mock.getMockedType()).toInstance(mock);
}
}
}
欠けている唯一のものは、この質問に対する答え (もしあれば) です。
受け入れられた回答への応答
このユースケースのために私が最終的に作成したものは次のとおりです。
import java.lang.reflect.Proxy;
import com.google.common.collect.Lists;
import com.google.inject.AbstractModule;
@SuppressWarnings({ "rawtypes", "unchecked" })
public class MockModule extends AbstractModule {
private final Iterable mocks;
public MockModule(Object mock) {
mocks = Lists.newArrayList(mock);
}
public MockModule(Iterable mocks) {
this.mocks = mocks;
}
protected void configure() {
for (Object mock : mocks) {
Class superclass = mock.getClass().getSuperclass();
if (superclass != Object.class && superclass != Proxy.class) {
bind(superclass).toInstance(mock);
continue;
}
Class[] interfaces = mock.getClass().getInterfaces();
if (interfaces.length > 0) {
bind(interfaces[0]).toInstance(mock);
}
}
}
}