2012-02-28 23 views
1

我使用嵌入的glassfish以下列方式:Glassfish的嵌入式+行家的Cobertura插件

public static void createContainer() throws IOException {   
    File target = new File("target/classes");  
    Map<String, Object> properties = new HashMap<String, Object>(); 
    properties.put(EJBContainer.MODULES, target); 
    properties.put("org.glassfish.ejb.embedded.glassfish.installation.root", 
      "/opt/glassfish3/glassfish"); 
    container = EJBContainer.createEJBContainer(properties); 
    context = container.getContext(); 
} 

@AfterSuite(alwaysRun = true) 
public static void closeContainer() throws NamingException { 
    // close container 
} 

// I use this method to lookup 
public static <T> T lookupBy(Class<T> type) { 
    try { 
     return (T) context.lookup("java:global/classes/" + type.getSimpleName()); 
    } catch (NamingException ex) { 
     throw new RuntimeException(ex); 
    } 
} 

的問題是,嵌入式GlassFish使用的類中的「目標/類」和行家的Cobertura使用「目標/生成 - 班/的Cobertura」。然後,第一次運行測試就沒事了,但第二次運行cobertura時,我收到一個java.lang.RuntimeException:javax.naming.NamingException(可能是因爲cobertura正在處理「target/generated-classes/cobertura 「而玻璃魚正在研究」目標/課程「)。

任何想法來解決這個問題?

回答

0

我嘗試了與cobertura和glassfish嵌入式相同的麻煩。這是我的設置來解決它。

我只是包括與GlassFish嵌入式都在Maven依賴的Cobertura沒有特定的選項。我不使用EJBContainer屬性EJBContainer.MODULES,玻璃魚嵌入自身發現在正常或cobertura階段的ejb類。

但是,JNDI便攜式名稱在正常和cobertura情況之間變化。所以我調整了你的lookupBy方法來管理這兩種情況。

最後這裏是我的代碼:

public static void createContainer() throws IOException {   
    container = EJBContainer.createEJBContainer(); 
    context = container.getContext(); 
    MyServiceLocal ejb = lookupBy(MyServiceLocal.class,MyServiceImpl.class); 
} 

public static <T> T lookupBy(Class<T> type, Class service) { 
    try { 
     return (T) context.lookup("java:global/classes/" + service.getSimpleName()); 
    } catch (NamingException ex) { 
     // lookup with cobertura 
     return (T) context.lookup("java:global/cobertura/" + service.getSimpleName() + "!" + type.getName()); 
    } 
}