JMockit 找不到 EJB,而是获取 NoSuchMethodException

JMockit can't find EJB, get NoSuchMethodException instead

尝试模拟 MessageDriven bean 但无法注入 @EJB。 @Resource 有效"fine"(至少不会破坏它)。 如果我在 MyMDB 中注释掉 @EJB 行,它就可以正常工作。可能是我错过的一件容易的事情,但我找不到它...

我还发现用@Inject 替换@EJB 会使其工作,但我想知道为什么它不能与@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();
}

问题是 JMockit 试图读取 @EJB 注释上的 lookup 属性,但此属性仅存在于 EJB 3.1+(在 Java EE 6 中添加),不在 EJB 3.0 (Java EE 5) 中。因此 NoSuchMethodException.

JMockit 1.40 正在修复此问题,但 Java EE 6 自 2010 年初以来就已可用。因此,从古老的 Java EE 5 升级也可以解决问题。