2015-09-15 74 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