1

我通过以下方式使用了嵌入式 glassfish:

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 使用“target/classes”中的类,而 maven cobertura 使用“target/generated-classes/cobertura”。然后,第一次运行测试没问题,但是在第二次运行 cobertura 时,我收到 java.lang.RuntimeException: javax.naming.NamingException (可能是因为 cobertura 正在处理“目标/生成的类/cobertura ”而 glassfish 正在研究“目标/类”)。

有什么想法可以解决这个问题???

4

1 回答 1

0

我用 cobertura 和 glassfish-embedded 试验了同样的麻烦。这是我解决它的设置。

我只是将glassfish-embedded-allcobertura包含在 maven 依赖项中,没有特定选项。我不使用 EJBContainer 属性EJBContainer.MODULES,glassfish-embedded 在正常或 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());
    }
}
于 2012-03-16T12:34:29.557 回答