我试图在DAO类中注入一个实体管理器,并使用焊接容器对其进行测试,但我一直收到以下异常:
org.jboss.weld.exceptions.NullInstanceException: WELD-000044无法从位于org.jboss.weld.bean.builtin.CallableMethodHandler.invoke(CallableMethodHandler.java:60)的org.jboss.weld.util.CleanableMethodHandler.invoke(CleanableMethodHandler.java:43)位于com的javax.persistence.EntityManager_$$_javassist_2.createQuery(EntityManager_$$_javassist_2.java)的org.jboss.weld.bean-se-module-ProducerField-com.playground.cdi_tutorial.beans.Resources.em获取实例.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) at sun.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) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) at org.junit.internal.runners.statements.InvokeMethod.evaluate( org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) at 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 ) (InvokeMethod.java:20)) 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) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at 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";}
producer类如下所示:
public class Resources {
@Produces
@EmProducer
@PersistenceContext(unitName = EmProducer.UNIT_NAME)
private EntityManager em;
...
}在我的测试中,当命中这行代码时,查询q= em.createQuery("from Employee");我得到上面的异常。但实体管理器em不为空。
PS:我使用WeldJUnit4Runner (http://www.hostettler.net/blog/2012/04/02/how-to-test-a-jsf-named-bean/)来运行我的测试。
我真的很感谢你的帮助。
谢谢!
发布于 2012-11-12 19:15:06
我建议在这种测试中使用Arquillian。它使得容器内测试变得非常简单(和快速)。你可以正常地注入EntityManager,剩下的就由Arquillian来处理。
https://stackoverflow.com/questions/13241445
复制相似问题