Я использую CDI-модуль JAR http://jglue.org/cdi-unit/
, чтобы иметь возможность использовать CDI в своих тестах JUnit 4, я ввел свой EJB и назвал метод, чтобы сохранить Client
объект, но я получаю следующее сообщение об ошибке:Java EE JUnit не работает с CDI-модулем при использовании EJB
java.lang.NoClassDefFoundError org/jboss/weld/environment/se/Weld
Мой Stateless EJB (OperationsEJB.java):
@Stateless
public class OperationsEJB {
@PersistenceContext(unitName="db_PU")
EntityManager em;
public void addClient(Client client) {
try {
em.persist(client);
} catch (Exception e) {
}
}
}
Мой JUnit тест:
import static org.junit.Assert.*;
import javax.inject.Inject;
import org.jglue.cdiunit.AdditionalClasses;
import org.jglue.cdiunit.CdiRunner;
import org.jglue.cdiunit.ejb.SupportEjb;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(CdiRunner.class)
@AdditionalClasses(OperationsEJB.class)
@SupportEjb
public class TestApp {
@Inject
OperationsEJB ejb;
@Test
public void test() {
Client c1 = new Client();
c1.setNomClient("client1");
ejb.addClient(c1);
assertNotNull(c1);
}
}
Я не использую Maven, я скачал weld-se-core-2.3.0.Final.jar
и я получил другую ошибку:
java.lang.NoClassDefFoundError: org/jboss/weld/environment/ContainerInstanceFactory
EDIT:
Теперь я использую Maven, это мой тест JUnit код:
OpTest.java:
@RunWith(CdiRunner.class)
@AdditionalClasses({OperationsEJB.class})
@SupportEjb
public class OpTest {
@Inject
OperationsEJB ejb;
@Test
public void test() {
assertNotNull(ejb);
}
}
Вот мой EJB:
@Stateless
public class OperationsEJB {
@PersistenceContext(unitName = "db_PU")
EntityManager em;
public void addClient(Client client) {
em.persist(client);
}
}
Когда я запускаю тест я получаю эту ошибку:
Oct 18, 2015 3:59:04 PM org.jboss.weld.bootstrap.WeldStartup <clinit>
INFO: WELD-000900: 2.2.9 (Final)
Oct 18, 2015 3:59:05 PM org.jboss.weld.bootstrap.WeldStartup startContainer
INFO: WELD-000101: Transactional services not available. Injection of @Inject UserTransaction not available. Transactional observers will be invoked synchronously.
Oct 18, 2015 3:59:06 PM org.jboss.weld.event.ExtensionObserverMethodImpl checkRequiredTypeAnnotations
WARN: WELD-000411: Observer method [BackedAnnotatedMethod] org.jglue.cdiunit.internal.TestScopeExtension.processAnnotatedType(@Observes ProcessAnnotatedType<Object>) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.
Oct 18, 2015 3:59:06 PM org.jboss.weld.event.ExtensionObserverMethodImpl checkRequiredTypeAnnotations
WARN: WELD-000411: Observer method [BackedAnnotatedMethod] public org.jglue.cdiunit.internal.ejb.EjbExtension.processAnnotatedType(@Observes ProcessAnnotatedType<Object>) receives events for all annotated types. Consider restricting events using @WithAnnotations or a generic type with bounds.
и ошибку, показанную в журнале JUnit является:
org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type OperationsEJB with qualifiers @Default
at injection point [UnbackedAnnotatedField] @Inject @EJB proj.OpTest.ejb
at proj.OpTest.ejb(OpTest.java:0)
WELD-001475: The following beans match by type, but none have matching qualifiers:
- Managed Bean [class com.proj.EJB.OperationsEJB] with qualifiers [@EJbQualifier @Any]
Спасибо авансовый.
Любая конкретная причина, по которой вы не используете maven (или любой другой инструмент управления зависимостями)? –
@JanGalinski Я все еще новичок, и мне сложно привыкнуть. Должен ли я действительно узнать, как его использовать? Должен ли я использовать его во всех моих проектах? – dwix
Как вы уже заметили, настройка всех зависимостей нетривиальных java-систем (например, ejb/cdi) вручную сложна. Вы не должны бороться с этим, так как кто-то еще уже предоставляет maven pom, содержащий правильный setp, который вы только можете использовать. Итак, да: узнайте maven и да, используйте его! –