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