Problems testing application with (Junit 5 - Weld 3 - CDI)
mauroreinehr Apr 12, 2018 8:01 AMHello!
I have the following classes:
public interface SessionFactoryTemplate {
public Session getCurrentSession();
public Session openSession();
public StatelessSession openStatelessSession();
}
@Singleton
public class SessionFactoryBuilder {
private SessionFactory sessionFactory;
@PostConstruct
void buildSessionFactory() {
final StandardServiceRegistry standardServiceRegistry = new StandardServiceRegistryBuilder().configure().build();
try {
Metadata metadata = new MetadataSources(standardServiceRegistry).buildMetadata();
sessionFactory = metadata.buildSessionFactory();
} catch (Exception e) {
StandardServiceRegistryBuilder.destroy(standardServiceRegistry);
e.printStackTrace();
throw new ExceptionInInitializerError(e);
}
}
@Produces
public SessionFactory getSessionFactory() {
return sessionFactory;
}
@PreDestroy
void destroySessionFactory() {
sessionFactory.close();
}
}
and finally the class that will be injected into the test:
@RequestScoped
public class AppSessionFactory implements SessionFactoryTemplate {
@Inject
private SessionFactory sessionFactory;
private Session currentSession;
@Override
public Session openSession() {
return sessionFactory.openSession();
}
@Override
public Session getCurrentSession() {
if (currentSession == null) {
currentSession = sessionFactory.openSession();
}
return currentSession;
}
@Override
public StatelessSession openStatelessSession() {
return sessionFactory.openStatelessSession();
}
@PreDestroy
private void closeSession() {
if (currentSession != null && currentSession.isOpen()) {
currentSession.close();
}
}
}
And here's the class to run the tests:
@EnableWeld
public class TesteWeld {
@Inject
private AppSessionFactory sf;
@WeldSetup
public WeldInitiator weld = WeldInitiator.from(Usuario.class).activate(RequestScoped.class, SessionScoped.class).build();
@Test
public void listarUsuarios() {
List usuarios = new ArrayList<>();
CriteriaBuilder builder = sf.getCurrentSession().getCriteriaBuilder();
CriteriaQuery criteria = builder.createQuery(Usuario.class);
Root root = criteria.from(Usuario.class);
criteria.select(root);
criteria.orderBy(builder.asc(root.get(Usuario_.nomeUsuario)));
TypedQuery q = sf.getCurrentSession().createQuery(criteria);
usuarios = q.getResultList();
for (Usuario u : usuarios) {
System.out.println(u.getNomeUsuario());
}
}
}
When you try to run the test with junit, you are returning the following error:
org.jboss.weld.exceptions.IllegalArgumentException: WELD-001408: Unsatisfied dependencies for type AppSessionFactory with qualifiers @Default
would anyone have a hint of what I'm doing wrong?
Thank you!