2015-10-17 4 views
2

Я использую 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] 

Спасибо авансовый.

+0

Любая конкретная причина, по которой вы не используете maven (или любой другой инструмент управления зависимостями)? –

+0

@JanGalinski Я все еще новичок, и мне сложно привыкнуть. Должен ли я действительно узнать, как его использовать? Должен ли я использовать его во всех моих проектах? – dwix

+1

Как вы уже заметили, настройка всех зависимостей нетривиальных java-систем (например, ejb/cdi) вручную сложна. Вы не должны бороться с этим, так как кто-то еще уже предоставляет maven pom, содержащий правильный setp, который вы только можете использовать. Итак, да: узнайте maven и да, используйте его! –

ответ

0

вид замещения аннотации @Ejb делает необходимым, чтобы компонент, который должен вводить, имел аннотацию @Default.

@Stateless 
@Default 
public class OperationsEJB { 

должен помочь.

Возможно: ejb-cdi-unit может помочь. у нас были подобные проблемы и для этого был создан дополнительный модуль поверх cdi-unit.

Смежные вопросы