4

我正在尝试在 DAO 类中注入一个实体管理器并使用焊接容器对其进行测试,但我不断收到以下异常:

org.jboss.weld.exceptions.NullInstanceException:WELD-000044 无法从 org.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) 在 com.playground.cdi_tutorial.model.EventDAO.getAllEvents(EventDAO.java:22) 在 com.playground.cdi_tutorial.beans.ValidationService.validateEvenNumbers(ValidationService.java:23) 在 com.playground.cdi_tutorial.beans.MyFactory .sayHi(MyFactory.java:15) 在 com.playground.cdi_tutorial.beans.MyFactoryTest.should_say_bye(MyFactoryTest.java:26) 在 sun.reflect。NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method. java:601) 在 org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 在 org.junit.runReflectiveCall(FrameworkMethod.java:44)。 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 的 org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)。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) 在 org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 在 org.eclipse.jdt.internal.junit。在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner 的 runner.TestExecution.run(TestExecution.java:38)。 runTests(RemoteTestRunner.java:683) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 在 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 不为空。

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 回答