9

クラスEmployeeのモックオブジェクトを作成すると。Employee オブジェクトのコンストラクターを呼び出しません。内部的には、Mockito が CGLIb とリフレクションを使用し、クラスをモックに拡張するプロキシ クラスを作成することを知っています。従業員のコンストラクターを呼び出さない場合、従業員クラスのモックインスタンスはどのように作成されますか?

4

2 に答える 2

7

Mockito は CGLib を使用してクラス オブジェクトを生成します。ただし、このクラス オブジェクトをインスタンス化するには、Objenesis http://objenesis.org/tutorial.htmlを使用します。

Objenesis は、さまざまな手法 (つまり、ObjectStream.readObject の呼び出しなど) を使用して、コンストラクターなしでオブジェクトをインスタンス化できます。

于 2011-01-17T15:38:41.777 に答える
2

Mockito はリフレクションと CGLib を使用して、動的に作成されたスーパークラスで Employee クラスを拡張しています。この一環として、Employee のすべてのコンストラクターを public にすることから始めます。これには、パラメーターを受け取るコンストラクターを宣言した場合はまだ存在しますが、プライベートなデフォルト コンストラクターが含まれます。

public <T> T imposterise(final MethodInterceptor interceptor, Class<T> mockedType, Class<?>... ancillaryTypes) {
    try {
        setConstructorsAccessible(mockedType, true);
        Class<?> proxyClass = createProxyClass(mockedType, ancillaryTypes);
        return mockedType.cast(createProxy(proxyClass, interceptor));
    } finally {
        setConstructorsAccessible(mockedType, false);
    }
}

private void setConstructorsAccessible(Class<?> mockedType, boolean accessible) {
    for (Constructor<?> constructor : mockedType.getDeclaredConstructors()) {
        constructor.setAccessible(accessible);
    }
}

私はそれをテストしていませんが、スーパークラスが作成されたときにデフォルトのコンストラクターを呼び出すと思います。プライベート デフォルト コンストラクター Employee() を宣言し、それにログを記録することで、自分でテストできます。

于 2010-06-30T13:00:52.293 に答える