You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@deltaspike.apache.org by Oliver Weise <ow...@innovationgate.com> on 2015/12/06 12:57:12 UTC

Problems getting to run unit test with CdiTestRunner

Hi everyone,

I'm having a hard time finding a way to write unittests for my CDI enabled project using CdiTestRunner from Deltaspike 
Test-Control. I'm trying a pretty basic setup, effectively consisting of these four classes:

1. A facade to retrieve Company entities (which are simple JPA entity beans):

@Default
@RequestScoped
public class CompanyFacade {

     @Inject
     private CompanyDAO _companyDao; // This is a deltaspike data DAO

     @Transactional
     public Company get(String id) {
         return _companyDao.findBy(id);
     }

     @Transactional
     public Company save(Company company) {
         if (company.getCreateTimeStamp() == null) {
             company.setCreateTimeStamp(new Date());
         }
         return _companyDao.save(company);
     }

     @Transactional
     public SortableLazyList<Company> findAll() {
         ...
     }

}

2. The DAO:

@Repository(forEntity=Company.class)
@Default
@Dependent
public interface CompanyDAO extends EntityRepository<Company, String>, EntityManagerDelegate<Company> {

     @Query(value = "select e from Company e")
     public QueryResult<Company> findCompanies();

}

3. An Entity Manager Provider for the Tests, which uses a temporary H2 database, registered via beans.xml:

@Alternative
public class TestEntityManagerProducer {

     @Produces
     public EntityManager create() {
         return Persistence.createEntityManagerFactory("mamsTestCDI").createEntityManager();
     }

     public void close(@Disposes EntityManager em) {
         if (em.isOpen()) {
             em.close();
         }

     }

}

4. And the test class:

@RunWith(CdiTestRunner.class)
public class CompanyFacadeTest extends TestCase {

     @Inject
     private CompanyFacade _companyFacade;

     @Test
     public void generalTest() {

         Company c;
         c = new Company();
         c.setKey(UUID.randomUUID().toString());
         c.setName("A company");
         c.setDescription("Such a company");
         _companyFacade.save(c);

         assertEquals(_companyFacade.findAll().size(), 1);
     }

}



My Problems:

1.) The Test will not inject the CompanyFacade class. I'm trying with two different CDI implementations, Weld and 
OpenEJB. Both say that they cannot find something to inject. Weld uses the infamous error "WELD-001408: Unsatisfied 
dependencies". OpenEJB says "Api type [com.musicacademy.mams.facades.CompanyFacade] is not found with the qualifiers".

The only way that I can make this work is to a) Also add @Alternative to the CompanyFacade and b) add it to the 
beans.xml (which will break this functionality on the live server, where everything is actually working as intended).

2.) But then I get a different error when saving the Company in the test, which effectively tells me that JTA is not 
properly setup (as I think):

org.apache.deltaspike.data.api.QueryInvocationException: Failed calling Repository: 
[Repository=com.musicacademy.mams.dao.CompanyDAO,entity=com.musicacademy.mams.data.Company,method=save,exception=class 
javax.naming.NameNotFoundException,message=null
     at org.apache.deltaspike.data.impl.handler.QueryHandler.process(QueryHandler.java:134)
     at org.apache.deltaspike.data.impl.handler.QueryHandler.invoke(QueryHandler.java:108)
     at 
org.apache.deltaspike.proxy.impl.invocation.DelegateManualInvocationHandler.proceedOriginal(DelegateManualInvocationHandler.java:46)
     at 
org.apache.deltaspike.proxy.impl.invocation.AbstractManualInvocationHandler.invoke(AbstractManualInvocationHandler.java:63)
     at 
org.apache.deltaspike.proxy.impl.invocation.DelegateManualInvocationHandler.staticInvoke(DelegateManualInvocationHandler.java:39)
     at com.musicacademy.mams.dao.CompanyDAO$$DSPartialBeanProxy.save(Unknown Source)
     at com.musicacademy.mams.facades.CompanyFacade.save(CompanyFacade.java:74)
     ...
Caused by: javax.naming.NameNotFoundException; remaining name 'TransactionSynchronizationRegistry'
     at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:449)
     at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:536)
     at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:551)
     at org.eclipse.jetty.jndi.java.javaRootURLContext.lookup(javaRootURLContext.java:117)
     at javax.naming.InitialContext.lookup(InitialContext.java:417)
     at org.apache.deltaspike.core.impl.util.JndiUtils.lookup(JndiUtils.java:96)
     at 
org.apache.deltaspike.jpa.impl.transaction.BeanManagedUserTransactionStrategy.resolveTransactionRegistry(BeanManagedUserTransactionStrategy.java:195)
     at 
org.apache.deltaspike.jpa.impl.transaction.BeanManagedUserTransactionStrategy$UserTransactionAdapter.<init>(BeanManagedUserTransactionStrategy.java:210)
     at 
org.apache.deltaspike.jpa.impl.transaction.BeanManagedUserTransactionStrategy.getTransaction(BeanManagedUserTransactionStrategy.java:142)
     at 
org.apache.deltaspike.jpa.impl.transaction.ResourceLocalTransactionStrategy.rollbackAllTransactions(ResourceLocalTransactionStrategy.java:336)
     at 
org.apache.deltaspike.jpa.impl.transaction.ResourceLocalTransactionStrategy.execute(ResourceLocalTransactionStrategy.java:154)
     at org.apache.deltaspike.data.impl.tx.TransactionalQueryRunner.executeTransactional(TransactionalQueryRunner.java:72)
     at org.apache.deltaspike.data.impl.tx.TransactionalQueryRunner.executeQuery(TransactionalQueryRunner.java:54)
     at org.apache.deltaspike.data.impl.handler.QueryHandler.process(QueryHandler.java:122)
     ...

So I'm actually thinking that my CDI test environment is generally not really working. As I'm new to CDI I might be 
missing something pretty basic, so any help is appreciated.

An extract from my Ivy dependencies for the tests:

         <dependency org="org.apache.deltaspike.modules" name="deltaspike-test-control-module-api" 
rev="&deltaspike.version;" conf="test->default"/>
         <dependency org="org.apache.deltaspike.modules" name="deltaspike-test-control-module-impl" 
rev="&deltaspike.version;" conf="test->default"/>
         <dependency org="org.apache.deltaspike.cdictrl" name="deltaspike-cdictrl-openejb" rev="&deltaspike.version;" 
conf="test->default"/>
         <dependency org="org.apache.openejb" name="openejb-core" rev="4.7.2" conf="test->default"/>
         <dependency org="com.fasterxml" name="classmate" rev="1.3.1" conf="test->default"/>



Kind regards,
Oliver Weise


Re: Problems getting to run unit test with CdiTestRunner

Posted by "John D. Ament" <jo...@apache.org>.
Hi Oliver,

does your alternative not extend anything? or was that left out?

John


On Sun, Dec 6, 2015 at 9:43 AM Oliver Weise <ow...@innovationgate.com> wrote:

> Hi everyone,
>
> I'm having a hard time finding a way to write unittests for my CDI enabled
> project using CdiTestRunner from Deltaspike
> Test-Control. I'm trying a pretty basic setup, effectively consisting of
> these four classes:
>
> 1. A facade to retrieve Company entities (which are simple JPA entity
> beans):
>
> @Default
> @RequestScoped
> public class CompanyFacade {
>
>      @Inject
>      private CompanyDAO _companyDao; // This is a deltaspike data DAO
>
>      @Transactional
>      public Company get(String id) {
>          return _companyDao.findBy(id);
>      }
>
>      @Transactional
>      public Company save(Company company) {
>          if (company.getCreateTimeStamp() == null) {
>              company.setCreateTimeStamp(new Date());
>          }
>          return _companyDao.save(company);
>      }
>
>      @Transactional
>      public SortableLazyList<Company> findAll() {
>          ...
>      }
>
> }
>
> 2. The DAO:
>
> @Repository(forEntity=Company.class)
> @Default
> @Dependent
> public interface CompanyDAO extends EntityRepository<Company, String>,
> EntityManagerDelegate<Company> {
>
>      @Query(value = "select e from Company e")
>      public QueryResult<Company> findCompanies();
>
> }
>
> 3. An Entity Manager Provider for the Tests, which uses a temporary H2
> database, registered via beans.xml:
>
> @Alternative
> public class TestEntityManagerProducer {
>
>      @Produces
>      public EntityManager create() {
>          return
> Persistence.createEntityManagerFactory("mamsTestCDI").createEntityManager();
>      }
>
>      public void close(@Disposes EntityManager em) {
>          if (em.isOpen()) {
>              em.close();
>          }
>
>      }
>
> }
>
> 4. And the test class:
>
> @RunWith(CdiTestRunner.class)
> public class CompanyFacadeTest extends TestCase {
>
>      @Inject
>      private CompanyFacade _companyFacade;
>
>      @Test
>      public void generalTest() {
>
>          Company c;
>          c = new Company();
>          c.setKey(UUID.randomUUID().toString());
>          c.setName("A company");
>          c.setDescription("Such a company");
>          _companyFacade.save(c);
>
>          assertEquals(_companyFacade.findAll().size(), 1);
>      }
>
> }
>
>
>
> My Problems:
>
> 1.) The Test will not inject the CompanyFacade class. I'm trying with two
> different CDI implementations, Weld and
> OpenEJB. Both say that they cannot find something to inject. Weld uses the
> infamous error "WELD-001408: Unsatisfied
> dependencies". OpenEJB says "Api type
> [com.musicacademy.mams.facades.CompanyFacade] is not found with the
> qualifiers".
>
> The only way that I can make this work is to a) Also add @Alternative to
> the CompanyFacade and b) add it to the
> beans.xml (which will break this functionality on the live server, where
> everything is actually working as intended).
>
> 2.) But then I get a different error when saving the Company in the test,
> which effectively tells me that JTA is not
> properly setup (as I think):
>
> org.apache.deltaspike.data.api.QueryInvocationException: Failed calling
> Repository:
>
> [Repository=com.musicacademy.mams.dao.CompanyDAO,entity=com.musicacademy.mams.data.Company,method=save,exception=class
> javax.naming.NameNotFoundException,message=null
>      at
> org.apache.deltaspike.data.impl.handler.QueryHandler.process(QueryHandler.java:134)
>      at
> org.apache.deltaspike.data.impl.handler.QueryHandler.invoke(QueryHandler.java:108)
>      at
>
> org.apache.deltaspike.proxy.impl.invocation.DelegateManualInvocationHandler.proceedOriginal(DelegateManualInvocationHandler.java:46)
>      at
>
> org.apache.deltaspike.proxy.impl.invocation.AbstractManualInvocationHandler.invoke(AbstractManualInvocationHandler.java:63)
>      at
>
> org.apache.deltaspike.proxy.impl.invocation.DelegateManualInvocationHandler.staticInvoke(DelegateManualInvocationHandler.java:39)
>      at
> com.musicacademy.mams.dao.CompanyDAO$$DSPartialBeanProxy.save(Unknown
> Source)
>      at
> com.musicacademy.mams.facades.CompanyFacade.save(CompanyFacade.java:74)
>      ...
> Caused by: javax.naming.NameNotFoundException; remaining name
> 'TransactionSynchronizationRegistry'
>      at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:449)
>      at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:536)
>      at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:551)
>      at
> org.eclipse.jetty.jndi.java.javaRootURLContext.lookup(javaRootURLContext.java:117)
>      at javax.naming.InitialContext.lookup(InitialContext.java:417)
>      at
> org.apache.deltaspike.core.impl.util.JndiUtils.lookup(JndiUtils.java:96)
>      at
>
> org.apache.deltaspike.jpa.impl.transaction.BeanManagedUserTransactionStrategy.resolveTransactionRegistry(BeanManagedUserTransactionStrategy.java:195)
>      at
>
> org.apache.deltaspike.jpa.impl.transaction.BeanManagedUserTransactionStrategy$UserTransactionAdapter.<init>(BeanManagedUserTransactionStrategy.java:210)
>      at
>
> org.apache.deltaspike.jpa.impl.transaction.BeanManagedUserTransactionStrategy.getTransaction(BeanManagedUserTransactionStrategy.java:142)
>      at
>
> org.apache.deltaspike.jpa.impl.transaction.ResourceLocalTransactionStrategy.rollbackAllTransactions(ResourceLocalTransactionStrategy.java:336)
>      at
>
> org.apache.deltaspike.jpa.impl.transaction.ResourceLocalTransactionStrategy.execute(ResourceLocalTransactionStrategy.java:154)
>      at
> org.apache.deltaspike.data.impl.tx.TransactionalQueryRunner.executeTransactional(TransactionalQueryRunner.java:72)
>      at
> org.apache.deltaspike.data.impl.tx.TransactionalQueryRunner.executeQuery(TransactionalQueryRunner.java:54)
>      at
> org.apache.deltaspike.data.impl.handler.QueryHandler.process(QueryHandler.java:122)
>      ...
>
> So I'm actually thinking that my CDI test environment is generally not
> really working. As I'm new to CDI I might be
> missing something pretty basic, so any help is appreciated.
>
> An extract from my Ivy dependencies for the tests:
>
>          <dependency org="org.apache.deltaspike.modules"
> name="deltaspike-test-control-module-api"
> rev="&deltaspike.version;" conf="test->default"/>
>          <dependency org="org.apache.deltaspike.modules"
> name="deltaspike-test-control-module-impl"
> rev="&deltaspike.version;" conf="test->default"/>
>          <dependency org="org.apache.deltaspike.cdictrl"
> name="deltaspike-cdictrl-openejb" rev="&deltaspike.version;"
> conf="test->default"/>
>          <dependency org="org.apache.openejb" name="openejb-core"
> rev="4.7.2" conf="test->default"/>
>          <dependency org="com.fasterxml" name="classmate" rev="1.3.1"
> conf="test->default"/>
>
>
>
> Kind regards,
> Oliver Weise
>
>