2015-09-15 118 views
3

測試REST端點服務,我得到了一個JAX-RS資源球衣 - 在EJB注入

@Path("rest/v1/serviceemail") 
public class PreviewResource implements Preview 
{ 
    @EJB 
    private Mapper mapper; 

我創建與新澤西州的測試框架,核心和球衣測試框架,grizzly2的IT測試。

當我啓動測試時,ejb沒有注入服務,所以我收到一個NPE。

+0

模擬'Mapper'。除非您需要完整的集成測試,否則您需要可以加載完整EE環境的東西。也許像arquillian。 –

+0

你可以通過Mockito嘲笑'Mapper'看到一種方式[這裏](http://stackoverflow.com/a/27447345/2587435) –

+0

我在考慮集成測試,因爲單元測試已經完成;所以我想使用輕型EE嵌入式容器。 –

回答

1

我通過實施定製InjectableProvider找到了解決方案。以下代碼取自Oracle article

import javax.ejb.EJB; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 
import javax.ws.rs.ext.Provider; 

import com.sun.jersey.core.spi.component.ComponentContext; 
import com.sun.jersey.core.spi.component.ComponentScope; 
import com.sun.jersey.spi.inject.Injectable; 
import com.sun.jersey.spi.inject.InjectableProvider; 

@Provider 
public class EJBProvider implements InjectableProvider<EJB, Type> { 

    public Scope getScope() { 
     return Scope.Singleton; 
    } 

    public Injectable getInjectable(ComponentContext cc, EJB ejb, Type t) { 
     if (!(t instanceof Class)) return null; 

     try { 
      Class c = (Class)t;   
      Context ic = new InitialContext(); 

      final Object o = ic.lookup(c.getName()); 

      return new Injectable<Object>() { 
       public Object getValue(HttpContext c) { 
        return o; 
       }      
      };    
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 
} 

我不得不稍微調整它以適合我的環境。還要注意提供者必須和你的服務類在同一個包中,否則它將不會被拾取(它在文章中沒有說)。

+0

您可以提供更多詳細信息,或者可以添加集成測試作爲示例嗎? – Daniel