2017-06-20 16 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>