[RESOLVIDO] Como criar um pool de conexões no JUnit:?

1 resposta
D

Olá, amigos, estou tentando acessar meu pool de conexões (JNDI) utilizando o Junit, mas está difícil, estou há dias, já tentei de diversas maneiras e não consigo.

Hoje, meu código está assim:
public class NewEmptyJUnitTest {

    public static EntityManager em;

    public NewEmptyJUnitTest() {
    }

    @BeforeClass
    public static void setUpClass() throws Exception {

        try {
            // Create initial context
            System.setProperty(Context.INITIAL_CONTEXT_FACTORY,
                    "org.apache.naming.java.javaURLContextFactory");
            System.setProperty(Context.URL_PKG_PREFIXES,
                    "org.apache.naming");
            InitialContext ic = new InitialContext();

            ic.createSubcontext("java:");
            ic.createSubcontext("java:/comp");
            ic.createSubcontext("java:/comp/env");
            ic.createSubcontext("java:/comp/env/jdbc");

            Properties properties = new Properties();
            properties.setProperty("url", "jdbc:mysql://sitekkk.net.br/schema");
            properties.setProperty("maxActive", "10");
            properties.setProperty("maxIdle", "8");
            properties.setProperty("minIdle", "10");
            properties.setProperty("maxWait", "10");
            properties.setProperty("testOnBorrow", "true");
            properties.setProperty("username", "user");
            properties.setProperty("password", "kk123");
            properties.setProperty("validationQuery", "SELECT 1");
            properties.setProperty("removeAbandoned", "true");
            properties.setProperty("removeAbandonedTimeout", "1");
            properties.setProperty("logAbandoned", "true");
            DataSource ds = BasicDataSourceFactory.createDataSource(properties);

            ic.bind("java:/comp/env/jdbc/schema", ds);

        } catch (NamingException ex) {
            Logger.getLogger(NewEmptyJUnitTest.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    @AfterClass
    public static void tearDownClass() throws Exception {
    }

    @Before
    public void setUp() {
    }

    @After
    public void tearDown() {
    }
Mas retorna o seguinte erro:
junit.framework.TestListener: addError(br.com.incard.testes.NewEmptyJUnitTest, org/apache/commons/pool/impl/GenericObjectPool)
Tests run: 0, Failures: 0, Errors: 1, Time elapsed: 25,163 sec

Testcase: br.com.incard.testes.NewEmptyJUnitTest:	Caused an ERROR
org/apache/commons/pool/impl/GenericObjectPool
java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool
	at org.apache.commons.dbcp.BasicDataSourceFactory.createDataSource(BasicDataSourceFactory.java:167)
	at br.com.incard.testes.NewEmptyJUnitTest.setUpClass(NewEmptyJUnitTest.java:71) // aqui no caso é linha 37
Caused by: java.lang.ClassNotFoundException: org.apache.commons.pool.impl.GenericObjectPool
	at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
O jar do commons-dbcp-1.4 já está configurado nas bibliotecas tanto do projeto quanto do teste.

Meu sistema web funciona perfeitamente, mas eu simplesmente não consigo acessar minha base de dados a partir do jUnit. Há alguma estratégia diferente para conseguir acessar a base de dados a partir de Junit? Eu uso MySQL

Obrigado!

1 Resposta

D

descobri como resolver o problema… simples!

Quando eu fazia deploy local da minha aplicação web, o acesso ao banco era fornecido pelo sevidor, no caso, o glashfish. É lá que estavam configuradas as informações da url da base, usuario, senha, driver, etc. O JUnit - ainda não sei por qual razão - não consegue acessar o servidor. Para resolver isso, adicionei no método setUp do Junit a criação do entitymanager para que, sempre que eu executar a classe, ele execute antes esse código.

No meu persistence.xml, eu mudei o transaction-type de “JTA” para “RESOURCE_LOCAL” e adicionei no próprio persistence.xml as informações de usuario, senha e url: <persistence-unit name="IncardWebPU" transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <jta-data-source>jdbc/base</jta-data-source> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="eclipselink.logging.level" value="FINE"/> <property name="eclipselink.ddl-generation" value="create-tables"/> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://site.net.br:3306/base"/> <property name="javax.persistence.jdbc.password" value="passwd"/> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> <property name="javax.persistence.jdbc.user" value="user"/> </properties> </persistence-unit>E funcionou!!!

No futuro eu vou acrescentar duas unidades de persistência: uma para o sistema web e outra para o junit.
Alguém tem algo a acrescentar?

Criado 2 de abril de 2013
Ultima resposta 5 de abr. de 2013
Respostas 1
Participantes 1