[Java EE] Problema JUnit e alcuni chiarimenti su jee

Discussione in 'Java' iniziata da Sevenjeak, 6 Gennaio 2018.

Tag (etichette):
  1. Sevenjeak

    Sevenjeak Utente Attivo

    Registrato:
    27 Novembre 2012
    Messaggi:
    80
    Mi Piace Ricevuti:
    2
    Punteggio:
    8
    Sesso:
    Maschio
    Home Page:
    Sto studiando in questo periodo Java EE ( seguendo in particolar modo le guide su html.it ), comunque, ho iniziato con studiare il jsp le servlet e le ejb, ora sto vedendomi i Session Bean Stateless, e fin qui tutto apposto.

    Seguendo in particolare questa guida:

    http://www.html.it/guide/guida-j2ee/

    Come scritto nel capitolo 3, mi sono creato un progetto ear ( che da quello che ho ben capito mi occorre principalmente per distribuire in futuro i moduli ejb contenuti in esso, o sbaglio? ), per poi creare un progetto ejb, ho collegato, come scritto in guida il projetto ejb al modulo enterprise ( progetto ear ), l'unico cambiamento che ho fatto, e nel codice, creando una classe che per adesso, contiene due semplici metodi, uno che ritorna il parametro passato incrementato e l'altro che lo ritorna decrementato.

    Tutto il codice, l'interfaccia comune e l'interfaccia locale e remota lo inserito nel pachetto testing.stateless, contenente questi sorgenti:

    TestStatelessInterface.java ( interfaccia comune )
    Codice:
    package testing.stateless;
    
    public interface TestStatelessInterface {
        public int increseValue(int value);
        public int decreaseValue(int value);
    }
    
    TestStatelessLocal.java ( interfaccia locale )
    Codice:
    package testing.stateless;
    
    import javax.ejb.Local;
    
    @Local
    public interface TestStatelessLocal extends TestStatelessInterface {
    
    }
    TestStatelessRemote.java ( interfaccia remota )
    Codice:
    package testing.stateless;
    
    import javax.ejb.Remote;
    
    @Remote
    public interface TestStatelessRemote extends TestStatelessInterface {
    
    }
    
    TestStateless.java ( classse del session bean )
    Codice:
    package testing.stateless;
    
    import javax.ejb.LocalBean;
    import javax.ejb.Stateless;
    
    /**
     * Session Bean implementation class TestStateless
     */
    @Stateless(mappedName = "TestStateless")
    public class TestStateless implements TestStatelessRemote, TestStatelessLocal {
    
        /**
         * Default constructor.
         */
        public TestStateless() {
            // TODO Auto-generated constructor stub
        }
    
        @Override
        public int increseValue(int value) {
            // TODO Auto-generated method stub
            return value++;
        }
    
        @Override
        public int decreaseValue(int value) {
            // TODO Auto-generated method stub
            return value--;
        }
    
    }
    Il problema e quando eseguo l'unit test ( provando a crearla sia nel metodo utilizzato nella stessa guida che con junit5, prendendo spunto da altre guide online ).

    In poche parole la unit test che ho realizzato e questa ( si trova nel packege test dello stesso progetto ejb ):

    Codice:
    package test;
    
    import static org.junit.jupiter.api.Assertions.*;
    
    import java.util.Properties;
    
    import testing.stateless.TestStatelessRemote;
    import javax.naming.*;
    
    import org.junit.jupiter.api.AfterAll;
    import org.junit.jupiter.api.BeforeAll;
    import org.junit.jupiter.api.Test;
    
    import junit.framework.TestCase;
    
    
    class IntegrationTest {
        private static Context namingContext;
        private static TestStatelessRemote ejbRemote;
        private static final String REMOTE_JNDI_NAME="/FirstEar/FirstEJBProject/TestStateless!testing.stateless.TestStatelessRemote";
     
        @BeforeAll
        public static void init() {
            try {
                Properties jndiProperties = new Properties();
                jndiProperties.put("jboss.naming.client.ejb.context", true);
                jndiProperties.put(Context.PROVIDER_URL, "http-remoting://localhost");
                jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
                namingContext = new InitialContext(jndiProperties);
            } catch (NamingException e) {
                e.printStackTrace();
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        }
    
        @Test
        public void testStateless() {
            try {
                ejbRemote = (TestStatelessRemote) namingContext.lookup(REMOTE_JNDI_NAME);
            
                TestCase.assertEquals(ejbRemote.decreaseValue(1), 0);
                TestCase.assertEquals(ejbRemote.increseValue(1), 2);
            } catch (NamingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
     
        @AfterAll
        public static void destroy() {
            try {
                namingContext.close();
            } catch (NamingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    Inserendo, nel clash patch, oltre alla libreria JUnit5 ( creata da eclipse ) il jar ( che ho trovato su internet ) wildfly-naming-client-1.0.4.Final.jar ( che mi risolve l'eccezione NoInitialContext, per l'application server che uso )

    Fatto questo, eseguo il codice, e mi viene stampata questa eccezione:

    gen 06, 2018 11:41:54 AM org.jboss.naming.remote.client.InitialContextFactory <clinit>
    INFO: WFNAM00025: org.jboss.naming.remote.client.InitialContextFactory is deprecated; new applications should use org.wildfly.naming.client.WildFlyInitialContextFactory instead
    gen 06, 2018 11:41:55 AM org.wildfly.naming.client.Version <clinit>
    INFO: WildFly Naming version 1.0.4.Final

    Ovviamente il test non mi si esegue proprio.

    Per quando riguarda il recupero dell'interfaccia locale in un web project ( come viene anche mostrato nel capitolo 5 della guida postata qui sopra ) mi funziona tutto correttamente ( premettendo che ho provato solamente il primo codice, non ho ancora provato a recuperare la classe locale tramite la classe InitialContext )

    Cmq, ritornando a noi, perché l'unit test non mi funziona?

    P.S.: Ah.. Quasi dimenticavo, come application server, sto usando WildFly 11.0.0.Final

    EDIT
    :

    Leggendo bene il codice dell'ore mi sono accordo che la classe InitialContext nel package org.jboss.naming.remote.client è obsoleta ed è stata sostituita, quindi ho modificato la mia unit test cosi:

    Codice:
    package test;
    
    import static org.junit.jupiter.api.Assertions.*;
    
    import java.util.Properties;
    
    import testing.stateless.TestStatelessRemote;
    import javax.naming.*;
    
    import org.junit.jupiter.api.AfterAll;
    import org.junit.jupiter.api.BeforeAll;
    import org.junit.jupiter.api.Test;
    
    import junit.framework.TestCase;
    
    
    class IntegrationTest {
        private static Context namingContext;
        private static TestStatelessRemote ejbRemote;
        private static final String REMOTE_JNDI_NAME="/FirstEar/FirstEJBProject/TestStateless!testing.stateless.TestStatelessRemote";
        
        @BeforeAll
        public static void init() {
            try {
                Properties jndiProperties = new Properties();
                jndiProperties.put("jboss.naming.client.ejb.context", true);
                jndiProperties.put(Context.PROVIDER_URL, "http-remoting://localhost");
                jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.wildfly.naming.client.WildFlyInitialContextFactory");
                namingContext = new InitialContext(jndiProperties);
            } catch (NamingException e) {
                e.printStackTrace();
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        }
    
        @Test
        public void testStateless() {
            try {
                ejbRemote = (TestStatelessRemote) namingContext.lookup(REMOTE_JNDI_NAME);
                
                TestCase.assertEquals(ejbRemote.decreaseValue(1), 0);
                TestCase.assertEquals(ejbRemote.increseValue(1), 2);
            } catch (NamingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        @AfterAll
        public static void destroy() {
            try {
                namingContext.close();
            } catch (NamingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    Ora l'eccezione che mi avverte di non usare l'initialContext obsoleto non appare più, ma mi compare pur sempre l'eccezione:

    gen 06, 2018 12:56:12 PM org.wildfly.naming.client.Version <clinit>
    INFO: WildFly Naming version 1.0.4.Final

    Per risparmiare spazio sul post vi linko un file contenente tutte le eccezioni che JUnit mi da ( cosa che prima non avevo postato:

    https://mega.nz/#!fc8EDTyS!8O81gq3jDtf-cabwE5xdCHyaqlfZjVRTlt_yuNY8l5Q
     
    Ultima modifica: 6 Gennaio 2018
Sto caricando...

Condividi questa Pagina