EJB の統合テストのために、Glassfish 3.1 で EJB 3.1 Embeddable EJBContainer を使用しようとしています。私が理解できないクラスローディングの問題があります。
私のejbはdum-ejb.jarに組み込まれています。彼らはEclipseLink JPAを使用しています。また、クラスローディングの問題に対処しながら、EJB クライアント jar dum-ejb-client.jar も作成します。クライアント jar には、EJB インターフェイスとエンティティ クラス (通常はパラメーターまたは戻り値) が含まれます。クライアント jar には、ドロップされる可能性のある不要なクラスも多数含まれています (ただし、それによって問題がどのように解決されるのかわかりません)。
問題は、EclipseLink がエンティティ クラスにバイトコード ウィービングを行うため、junit テストの実行時にエンティティ クラスがクラスパスに存在してはならないことです: http://www.java.net/forum/topic/glassfish/glassfish/embedded-グラスフィッシュとウィービング
これを実行して、dum-ejb.jar が含まれないようにクラスパスを構成できます。EJBContainer を使用してサービスを java.lang.Object としてルックアップし、リフレクションを介してそのメソッドを呼び出すと、テストは機能します。しかしもちろん、それは私がテストを書きたい方法ではありません。
典型的なテストは次のようになります。
@Test
public void testInEJBContainer() throws Exception {
File ejbJarFile = new File("target/dum/dum-ejb.jar");
Map props = new HashMap();
props.put("org.glassfish.ejb.embedded.glassfish.instance.root",
"target/classes/instance-root");
props.put(EJBContainer.MODULES, new File[]{ejbJarFile});
EJBContainer container = EJBContainer.createEJBContainer(props);
CompanyService = (CompanyService)
container.getContext().lookup("java:global/dum/CompanyServiceImpl");
log.info("result of findAll() " + service.findAll(false));
}
CompanyService インターフェイスと返された Company Entity クラスがクラスパスにない場合、どのようにテストを実行できますか?
dum-ejb.jar がクラスパス上になく、dum-ejb-client.jar がある場合でも、EclipseLink のウィービングが壊れます。
これはまさに EJBContainer の典型的なユース ケースではないでしょうか。これに対する簡単な解決策があるはずではありませんか?