0

次のような模擬セットアップがあるとします。

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);
            }
        }
    }
}
4

2 に答える 2

1
Class mockedClass = mock.getClass().getInterfaces()[0];
System.out.println("Class is " + mockedClass.getCanonicalName());

印刷します:

Interface is MyInterface

それを行うにはおそらくもっと堅牢な方法がありますが、少なくともこの特定のJMockバージョンで仕事をこなすことができます。

于 2011-12-30T09:12:20.850 に答える
0

これを行う動機を理解しているかどうかはわかりません。JMock は通常、オブジェクトまたはオブジェクトの小さなクラスターを単体テストするために使用されます。これは、テストですべてが新しくなることを意味します。DI は通常、実際のコンポーネントのように見える何かを実行するときに、統合または受け入れテストのレベルで開始されます。

テスト内で DI を使用して何を示そうとしているのですか?

于 2011-12-30T09:19:41.363 に答える