4

DAOクラスにエンティティマネージャーを挿入し、溶接コンテナを使用してテストしようとしていますが、次の例外が発生し続けます。

org.jboss.weld.exceptions.NullInstanceException:WELD-000044org.jboss.weldのorg.jboss.weld.bean-se-module-ProducerField-com.playground.cdi_tutorial.beans.Resources.emからインスタンスを取得できません。 bean.builtin.CallableMethodHandler.invoke(CallableMethodHandler.java:60)at org.jboss.weld.util.CleanableMethodHandler.invoke(CleanableMethodHandler.java:43)at javax.persistence.EntityManager _ $$ _ javassist_2.createQuery(EntityManager _ $$_javassist_2。 java)at com.playground.cdi_tutorial.model.EventDAO.getAllEvents(EventDAO.java:22)at com.playground.cdi_tutorial.beans.ValidationService.validateEvenNumbers(ValidationService.java:23)at com.playground.cdi_tutorial.beans.MyFactory .sayHi(MyFactory.java:15)at com.playground.cdi_tutorial.beans.MyFactoryTest.should_say_bye(MyFactoryTest.java:26)atsun.reflect。NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method。 java:601)org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:44)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)atorg.junit。 runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java: 79)org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)でorg.junit.runnersで。BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)at org.junit.runners.ParentRunner $ 3.run(ParentRunner.java:193)at org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:52)at org.junit .runners.ParentRunner.runChildren(ParentRunner.java:191)at org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:42)at org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:184)at org.junit.runners.ParentRunner.run(ParentRunner.java:236)at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)atorg.eclipse.jdt.internal.junit。 runner.TestExecution.run(TestExecution.java:38)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)atorg.eclipse.jdt.internal.junit.runner.RemoteTestRunner。 runTests(RemoteTestRunner.java:683)org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

私は次のようにエンティティマネージャーを注入しようとします:

 @Inject
 @EmProducer
 EntityManager em;

EmProducerは次のようになります。

@Qualifier
@Target({ TYPE, METHOD, PARAMETER, FIELD })
@Retention(RUNTIME)
@Documented
public @interface EmProducer {

    public static final String UNIT_NAME = "cdi-tutorial";

}

そして、プロデューサークラスは次のようになります。

public class Resources {

 @Produces
 @EmProducer
 @PersistenceContext(unitName = EmProducer.UNIT_NAME)
 private EntityManager em;
       ...
    }

私のテストでは、このコード行がヒットすると、Query q = em.createQuery( "from Employee"); 上記の例外が発生します。ただし、エンティティマネージャemはnullではありません。

PS:テストの実行にはWeldJUnit4Runner(http://www.hostettler.net/blog/2012/04/02/how-to-test-a-jsf-named-bean/)を使用しています。

よろしくお願いします。

ありがとう!

4

1 に答える 1

1

この種のテストにはArquillianを使用することをお勧めします。これにより、コンテナー内テストが非常に簡単 (かつ高速) になります。普通に EntityManager を注入するだけで、残りは Arquillian が処理します...

于 2012-11-12T11:15:05.780 に答える