私のコードには、テスト時に痛みを引き起こす小さな食事療法がいくつかあります。小さな神々をバラバラにするのは、この演習にはあまりにも多くの努力であると仮定します。
x()
通常の問題は、のメソッドをテストしたいのですFoo
が、のインスタンスを作成するにはFoo
、Springのを満足させるためだけに存在するN(1 <N <10)のモックインスタンスを定義する必要があるということ@Autowire
です。本番環境では、これらのフィールドが配線されていることを確認する必要があるため、これらをオプションにすることはオプションではありません。
私が見る可能な解決策:
@Autowire
どういうわけか、テスト期間中、一部のフィールドはオプションであることをSpringに伝えます- テスト対象のコードが必要としない/必要としないものについては、呼び出し不可能なモックを渡します。
#1のやり方がわからないので、#2が道だと思います。私が好むのは、私が定義しなかったBeanのメソッド呼び出しに対して例外をスローするプロキシを返すBeanファクトリです。
したがって、不明なBeanの場合は、次のcreate
メソッドを呼び出す必要があります。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MustNotCallMe {
@SuppressWarnings( "unchecked" )
public static <T> T create( final Class<T> type, final Class<?>... types ) {
InvocationHandler handler = new InvocationHandler() {
@Override
public Object invoke( Object proxy, Method method, Object[] args ) throws Throwable {
if( "equals".equals( method.getName() ) && Object.class.equals( method.getDeclaringClass() ) ) {
return proxy == args[0];
}
throw new UnsupportedOperationException( "You must not call " + method );
}
};
Class<?>[] allClasses = new Class<?>[ types.length + 1 ];
allClasses[0] = type;
System.arraycopy( types, 0, allClasses, 1, types.length );
return (T) Proxy.newProxyInstance( MustNotCallMe.class.getClassLoader(), allClasses, handler );
}
}
このようなものはありますか?そうでない場合、Spring 3ユニットテストで自分のBeanファクトリをどのように注入しますか?
編集私はこの考えが言語の純粋主義者を混乱させることを知っています。現実だけが純粋になることはめったにありません。ここの誰かがステップアップして、ソフトウェアをリファクタリングするために必要なお金と手を私たちに与えてくれるなら、私たちはそれについて聞いてみたいです。それまでは、手作業をあまり必要とせずに問題を解決するソリューションは、特定の問題をはるかにうまく解決します:-)
BeanFactory
とは言うものの、必要なのは、スローすることはNoSuchBeanException
なく、代わりに「電話しないでください」プロキシを返すを作成する方法だけです。