2016-02-05 48 views
0

我有一個junit測試(集成測試)與嵌入式glassfish服務器。如果我在無狀態的ejb中使用lambda,我的測試失敗。沒有lambda表達式,我的測試工作正常。glassfish embedded v4.1.1和lambda

嵌入式glassfish服務器是否有任何修正或快照版本?我還沒有發現有關GlassFish的嵌入,所有:(

使用依賴快照版本的任何信息:

<dependency> 
    <groupId>org.glassfish.main.extras</groupId> 
    <artifactId>glassfish-embedded-all</artifactId> 
    <version>4.1.1</version> 
    <scope>test</scope> 
</dependency> 

如果我取消對該行(1)或(2),那麼我的例子豆的參考在我的JUnit測試空(出現查找失敗除外):(

豆/ EJB:

@Stateless 
@LocalBean 
public class ExampleBean { 

    @PersistenceContext 
    private EntityManager em; 

    public Person get(Long id) { 
     Optional<Person> p = Optional.ofNullable(em.find(Person.class, id)); 

     List<Person> persons = new ArrayList<>(); 
     persons.add(p.get()); 

     // (1) properties.forEach(person -> System.out.println(person)); 
     // (2) String name = person.map(Person::getName).orElse(null); 
     //System.out.println(name"); 
     return p; 
    } 
} 

測試類:

public class ExampleBeanTest { 
    @EJB 
    private static ExampleBean examplebean; 
    private static Context context; 
    private static EJBContainer container; 

    @BeforeClass 
    public static void init() { 
     Map<String, Object> props = new HashMap<String,Object>(); 
     props.put(EJBContainer.MODULES, new File[]{new File("target/test-classes"), new File("target/classes")}); 

     try { 
      container = EJBContainer.createEJBContainer(props); 
      context = container.getContext(); 
      examplebean = (ExampleBean) context.lookup("java:global/classes/ExampleBean"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @AfterClass 
    public static void tearDown() throws Exception { 
     if (container != null) { 
      container.close(); 
     } 
    } 

    @Test 
    public void testGet() throws NamingException { 
     assertNotNull(examplebean); 
     Person p = examplebean.get(1); 
     assertNotNull(p); 
     assertEquals("text", p.getName()); 
    } 
} 

是否有任何可以執行Java lambda表達式的juint test + java 8的嵌入式EE容器?

EDIT1: 我剛剛創建了lambda和經典迭代的另一個測試。經典迭代Bean運行正常,但forEach我有一個「查找失敗」異常。這裏發生了什麼?

public Person get(Long id) { 
    Optional<Person> person = Optional.ofNullable(em.find(Person.class, id)); 
    List<Person> persons = new ArrayList<>(); 
    persons.add(person.get()); 

    long l = persons.stream().count(); 
    System.out.println("length: " + l); // <- ok, result: 1 

    for (Person p : persons) { // <- ok, one result: "text" 
     String name = p.getName(); 
     System.out.println("name: " + name); 
    } 

    // if i keep the following line in my code i get a lookup failed exception 
    // if i comment these lines my code works fine 
    persons.forEach(pp -> { 
     System.out.println(pp.getName()); 
    }); 

return person.get(); 
} 

Exeption:

Feb 05, 2016 10:36:17 PM org.glassfish.ejb.embedded.EJBContainerProviderImpl createEJBContainer 
SEVERE: EJB6005:No EJB modules found 
javax.naming.NamingException: Lookup failed for 'java:global/classes/ExampleBean' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: classes] 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:491) 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:438) 
    at javax.naming.InitialContext.lookup(InitialContext.java:417) 
    at javax.naming.InitialContext.lookup(InitialContext.java:417) 
    at a.b.ExampleBeanTest.init(ExampleBeanTest.java:39) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74) 
Caused by: javax.naming.NameNotFoundException: classes 
    at com.sun.enterprise.naming.impl.TransientContext.resolveContext(TransientContext.java:299) 
    at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:207) 
    at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:208) 
    at com.sun.enterprise.naming.impl.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:66) 
    at com.sun.enterprise.naming.impl.LocalSerialContextProviderImpl.lookup(LocalSerialContextProviderImpl.java:114) 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:478) 
    ... 18 more 

EDIT2: 我可以在Maven日誌文件中看到NCLS部署-00009警告消息。只有一個相關的論壇主題發現:Glassfish deploy error 「Archive type of MyProject.jar was not recognized」。建議刪除lambda表達式。

行家登錄

Feb 06, 2016 8:49:37 AM org.glassfish.deployment.common.GenericAnnotationDetector scanArchive 
WARNING: NCLS-DEPLOYMENT-00009 
Feb 06, 2016 8:49:37 AM org.glassfish.ejb.embedded.EJBContainerProviderImpl createEJBContainer 
SEVERE: EJB6005:No EJB modules found 
javax.naming.NamingException: Lookup failed for 'java:global/classes/ExampleBean' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: classes] 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:491) 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:438) 
    at javax.naming.InitialContext.lookup(InitialContext.java:417) 
    at javax.naming.InitialContext.lookup(InitialContext.java:417) 
    at a.b.ExampleBeanTest.init(ExampleBeanTest.java:39) 
... 
Caused by: javax.naming.NameNotFoundException: classes 
... 

難道是BUG?

是否有任何工作,嵌入式EE容器用JAVA 8 + EJB/BEAN + LAMBDA執行JUNIT /集成測試?

我在哪裏可以報告glassfish-embedded-all模塊相關的錯誤?我只發現玻璃魚服務器相關的傑拉。

+0

爲什麼你的單元測試失敗?什麼錯誤? – Ferrybig

+0

org.glassfish.ejb.embedded.EJBContainerProviderImpl createEJBContainer SEVERE:EJB6005:找不到EJB模塊 javax.naming.NamingException:SerialContext中'java:global/classes/ExampleBean'的查找失敗[myEnv = {java.naming.factory .initial = com.sun.enterprise.naming.impl.SerialInitContextFactory,java.naming.factory.state = com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl,java.naming.factory.url.pkgs = com .sun.enterprise.naming} [根異常是javax.naming.NameNotFoundException:類] ... – zappee

+0

引起:javax.naming.NameNotFoundException:類 – zappee

回答