23/01/18 11:11
Sevenjeak
Salve,
Sto in questo periodo studiarmi il Java EE, ho iniziato con le pagine jsp ed ora sto passando agli ejb, ho creato con eclipse ee un progetto enterplace, collegato ad un progetto ejb, dove all'interno ho creato le seguente interfacce per un session bean stateless ( interfaccia locale, remota e un'interfaccia comune ad entrambi, contenuti nel package first.stateles ):
Ed in fine ho creato il session bean ( sempre nello stesso package ):
Come potete vedere anche da codice, i metodi della classe compiono semplici operazioni sui parametri passati.
Ora, provando a testarlo tramite una servlet in un progetto web ( ovviamente il progetto ejb è nel class-path del progetto ) richiamando l'interfaccia locale, mi funziona tutto correttamente, il problema è quando provo a testare l'interfaccia remota con JUnit5, tramite questa classe ( presente nel package test del progetto ejb ):
Prima di eseguire, per evitare l'eccezione NoInitialContextFactory, mi sono scaricato da questo sito:
jar-download.com/
Il jar e tutte le dipendenze necessarie, inserendole tutte nel class-path del progetto.
Ho risolto l'eccezione NoInitialContextFactory, anche se, eseguendo il test mi fallisce, in fauler trace mi da le seguenti eccezioni:
Ora, ho capito che il problema è nella prima riga del metodo test(), ma non di cosa si tratta, come potrei risolvere?
Sto in questo periodo studiarmi il Java EE, ho iniziato con le pagine jsp ed ora sto passando agli ejb, ho creato con eclipse ee un progetto enterplace, collegato ad un progetto ejb, dove all'interno ho creato le seguente interfacce per un session bean stateless ( interfaccia locale, remota e un'interfaccia comune ad entrambi, contenuti nel package first.stateles ):
package first.stateless; public interface OperationInterface { int sum(int... values); int divide(int... values); int subtract(int... values); int multiply(int... values); }
package first.stateless; import javax.ejb.Local; @Local public interface OperationLocal extends OperationInterface{ }
package first.stateless; import javax.ejb.Remote; @Remote public interface OperationRemote extends OperationInterface { }
Ed in fine ho creato il session bean ( sempre nello stesso package ):
package first.stateless; import javax.ejb.Stateless; import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; /** * Session Bean implementation class Operation */ @Stateless(mappedName = "Operation") public class Operation implements OperationRemote, OperationLocal { /** * Default constructor. */ public Operation() { // TODO Auto-generated constructor stub } @Override @TransactionAttribute(TransactionAttributeType.NEVER) public int sum(int... values) { int result = 0; for (int i = 0; i < values.length; i++) { result += values[i]; } return result; } @Override @TransactionAttribute(TransactionAttributeType.NEVER) public int divide(int... values) { int result = 0; for (int i = 0; i < values.length; i++) { result /= values[i]; } return result; } @Override @TransactionAttribute(TransactionAttributeType.NEVER) public int subtract(int... values) { int result = 0; for (int i = 0; i < values.length; i++) { result -= values[i]; } return result; } @Override @TransactionAttribute(TransactionAttributeType.NEVER) public int multiply(int... values) { int result = 0; for (int i = 0; i < values.length; i++) { result *= values[i]; } return result; } }
Come potete vedere anche da codice, i metodi della classe compiono semplici operazioni sui parametri passati.
Ora, provando a testarlo tramite una servlet in un progetto web ( ovviamente il progetto ejb è nel class-path del progetto ) richiamando l'interfaccia locale, mi funziona tutto correttamente, il problema è quando provo a testare l'interfaccia remota con JUnit5, tramite questa classe ( presente nel package test del progetto ejb ):
package test; import static org.junit.jupiter.api.Assertions.*; import java.util.Properties; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import first.stateless.OperationRemote; import junit.framework.TestCase; class IntegrationTest { private static Context initialContext; private static OperationRemote remoteObject; @AfterAll public static void init() throws NamingException { Properties jndiProperties = new Properties(); jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.wildfly.naming.client.WildFlyInitialContextFactory"); jndiProperties.put(Context.PROVIDER_URL, "http//localhost"); initialContext = new InitialContext(jndiProperties); } @Test public void test() throws NamingException { remoteObject = (OperationRemote) initialContext.lookup("java:global/FirstEAR/FirstEJB/Operation!first.stateless.OperationRemote"); TestCase.assertEquals(remoteObject.sum(10, 10), 20); } @BeforeAll public static void destroy() throws NamingException { /*initialContext.close(); initialContext = null;*/ } }
Prima di eseguire, per evitare l'eccezione NoInitialContextFactory, mi sono scaricato da questo sito:
jar-download.com/
Il jar e tutte le dipendenze necessarie, inserendole tutte nel class-path del progetto.
Ho risolto l'eccezione NoInitialContextFactory, anche se, eseguendo il test mi fallisce, in fauler trace mi da le seguenti eccezioni:
java.lang.NullPointerException at test.IntegrationTest.test(IntegrationTest.java:33) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:389) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod(TestMethodTestDescriptor.java:167) at org.junit.jupiter.engine.execution.ThrowableCollector.execute(ThrowableCollector.java:40) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:163) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:110) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute(HierarchicalTestExecutor.java:83) at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$null(HierarchicalTestExecutor.java:92) at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source) at java.util.stream.ReferencePipeline.accept(Unknown Source) at java.util.Iterator.forEachRemaining(Unknown Source) at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Unknown Source) at java.util.stream.AbstractPipeline.copyInto(Unknown Source) at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source) at java.util.stream.AbstractPipeline.evaluate(Unknown Source) at java.util.stream.ReferencePipeline.forEach(Unknown Source) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute(HierarchicalTestExecutor.java:92) at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$null(HierarchicalTestExecutor.java:92) at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source) at java.util.stream.ReferencePipeline.accept(Unknown Source) at java.util.Iterator.forEachRemaining(Unknown Source) at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Unknown Source) at java.util.stream.AbstractPipeline.copyInto(Unknown Source) at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source) at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source) at java.util.stream.AbstractPipeline.evaluate(Unknown Source) at java.util.stream.ReferencePipeline.forEach(Unknown Source) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.lambda$execute(HierarchicalTestExecutor.java:92) at org.junit.platform.engine.support.hierarchical.SingleTestExecutor.executeSafely(SingleTestExecutor.java:66) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:77) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:51) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:43) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:170) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:154) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:90) at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:82) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:539) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:761) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:461) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:207)
Ora, ho capito che il problema è nella prima riga del metodo test(), ma non di cosa si tratta, come potrei risolvere?
aaa