JMockit не может найти EJB, вместо этого получите NoSuchMethodException - PullRequest
0 голосов
/ 03 мая 2018

Попытка смоделировать bean-компонент MessageDriven, но не получается получить инъекцию @EJB. @Resource работает "отлично" (по крайней мере, не нарушает его). Если я закомментирую строку @EJB в MyMDB, она будет работать нормально. Вероятно, это была простая вещь, которую я пропустил, но я не могу ее найти ...

Также я обнаружил, что замена @EJB на @Inject заставит его работать, но я хочу знать, почему он не работает с @EJB, так как у нас много такого кода. Использование JDK7 и JMockit v1.39

Я получаю ошибку:

java.lang.RuntimeException: java.lang.NoSuchMethodException: com.sun.proxy.$Proxy7.lookup()
Caused by: java.lang.NoSuchMethodException: com.sun.proxy.$Proxy7.lookup()
    at java.lang.Class.getMethod(Class.java:1678)

MyMDB.java:

import javax.annotation.Resource;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.EJB;
import javax.ejb.MessageDriven;
import javax.jms.ConnectionFactory;
import javax.jms.Message;
import javax.jms.MessageListener;

@MessageDriven(activationConfig = {
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
        @ActivationConfigProperty(propertyName = "destination", propertyValue = "/queue/myqueue") })
public class MyMDB implements MessageListener {

    @Resource(mappedName = "java:/JmsBT")
    ConnectionFactory connectionFactory;

    @EJB
    ParConfigI parConfig;

    @Override
    public void onMessage(Message message) {
        System.out.println("onMessage called");
    }
}

MyMDBTest.java

import javax.jms.ConnectionFactory;
import javax.jms.Message;

import org.junit.Test;

import mockit.Injectable;
import mockit.Mocked;
import mockit.Tested;

public class MyMDBTest {
    @Tested
    MyMDB sut;

    @Injectable
    ConnectionFactory jmsbt;

    @Injectable
    ParConfigI parConfigI;

    @Mocked
    Message mockedMessage;

    @Test
    public void testSmall() {
        sut.onMessage(mockedMessage);
    }
}

ParConfigI.java

import javax.ejb.Local;

@Local
public interface ParConfigI {
    public void testmethod();
}

1 Ответ

0 голосов
/ 05 мая 2018

Проблема в том, что JMockit пытается прочитать атрибут lookup в аннотации @EJB, но этот атрибут существует только в EJB 3.1+ (добавлено в Java EE 6), а не в EJB 3.0 (Java EE 5). Отсюда NoSuchMethodException.

JMockit 1.40 исправляет это, но Java EE 6 была доступна с начала 2010 года. Таким образом, обновление с древней Java EE 5 также решило бы проблему.

...