2017-06-20 18 views
0

我开始使用的Arquillian以下the general getting started guide我可以成功复制,但using it for EJB testing由于失败Unable to inject resource - most probably incorrect InjectionServices SPI implementation这将导致@EJB财产不被注射/ null可以因此测试失败。@EJB注入失败,因为“无法注入资源 - 最有可能不正确InjectionServices SPI实现”

的招待员例子的扩展演示了这个问题:

@Local 
public interface GreeterIface { 

    void greet(PrintStream to, String name); 

    String createGreeting(String name); 
} 

EJB:

@Stateless 
public class Greeter implements GreeterIface{ 
    @Override 
    public void greet(PrintStream to, String name) { 
     to.println(createGreeting(name)); 
    } 

    @Override 
    public String createGreeting(String name) { 
     return "Hello, " + name + "!"; 
    } 
} 

和测试:

@RunWith(Arquillian.class) 
public class GreeterTest { 

    @Deployment 
    public static JavaArchive createDeployment() { 
     return ShrinkWrap.create(JavaArchive.class) 
      .addClasses(Greeter.class, GreeterIface.class) 
      .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"); 
    } 

    @EJB 
    private Greeter greeter; 

    @Test 
    public void should_create_greeting() { 
     Assert.assertEquals("Hello, Earthling!", 
      greeter.createGreeting("Earthling")); 
     greeter.greet(System.out, "Earthling"); 
    } 
} 

失败,因为

Jun 20, 2017 3:03:19 PM org.jboss.weld.injection.AbstractResourceInjection getResourceReference 
WARN: WELD-000834: Unable to inject resource - most probably incorrect InjectionServices SPI implementation: private richtercloud.arquillian.demo.Greeter richtercloud.arquillian.demo.GreeterTest.greeter 
    at richtercloud.arquillian.demo.GreeterTest.greeter(GreeterTest.java:0) 
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 1.012 sec <<< FAILURE! - in richtercloud.arquillian.demo.GreeterTest 
should_create_greeting(richtercloud.arquillian.demo.GreeterTest) Time elapsed: 0.035 sec <<< ERROR! 
java.lang.NullPointerException: null 
    at richtercloud.arquillian.demo.GreeterTest.should_create_greeting(GreeterTest.java:33) 

最好的,但不可用的提示会被

MCVEs被https://github.com/krichter722/arquillian-demo(这是应该的工作基础上引导扩展Java SE项目)和https://github.com/krichter722/arquillian-demo-2(我自己的Java EE项目)

我使用的Arquillian 1.1.13 。最后。

+0

正如我所看到的,测试使用焊接本身,而不是EJB容器,所以“@EJB @Resource,@Transact” ...不起作用。如果为测试开始一个野蝇需要付出很大的努力,那么在测试环境中可以使用扩展来模拟EJB,或许cdi-unit和ejb-cdi-unit可以提供帮助。有关更多文档,请参阅github。 – aschoerk

回答

0

您的pom.xml如何看起来像?您需要添加一些附加信息,以便arquillian可以启动容器并运行测试。

在“入门指南”中,他们正在运行一个仅适用于CDI的应用程序,并使用焊接作为实现来管理所需bean的注入。但在你的情况下,你想测试一个无状态bean的注入。在这种情况下,您需要添加诸如jboss/wildfly或glassfish的容器来运行测试。

此的Arquillian指南显示了如何在测试的Arquillian使用@EJBGetting Started: Rinse and Repeat

在引导JBoss AS中使用7。如果你想使用wildfly 10相反,你可以使用下面的依赖性:

<dependency> 
    <groupId>org.wildfly.arquillian</groupId> 
    <artifactId>wildfly-arquillian-container-remote</artifactId> 
    <version>2.1.0.Alpha3</version> 
</dependency>