Unit testing JMockit可以';如果找不到EJB,请改为获取NoSuchMethodException

Unit testing JMockit可以';如果找不到EJB,请改为获取NoSuchMethodException,unit-testing,ejb,jmockit,Unit Testing,Ejb,Jmockit,试图模拟消息驱动bean,但在注入@EJB时遇到问题。@Resource工作“很好”(至少不会破坏它)。 如果我在MyMDB中注释掉@EJB行,它可以正常工作。也许我错过了一件容易的事,但我找不到 我还发现用@Inject替换@EJB会使它工作,但我想知道为什么它不能与@EJB一起工作,因为我们有很多这样的代码。 使用JDK7和JMockitV1.39 我得到的错误是: java.lang.RuntimeException: java.lang.NoSuchMethodException: co

试图模拟消息驱动bean,但在注入@EJB时遇到问题。@Resource工作“很好”(至少不会破坏它)。 如果我在MyMDB中注释掉@EJB行,它可以正常工作。也许我错过了一件容易的事,但我找不到

我还发现用@Inject替换@EJB会使它工作,但我想知道为什么它不能与@EJB一起工作,因为我们有很多这样的代码。 使用JDK7和JMockitV1.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);
    }
}
parconfig.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


JMockit1.40正在解决这个问题,但JavaEE6自2010年初就已经可用了。因此,从古老的JavaEE5升级也可以解决这个问题。

在我复制并粘贴了上面的代码之后,测试对我来说运行良好。你确定只有这段代码会发生异常吗?我忘了补充说我使用的是旧的JavaEE5…谢谢你的回答。我希望我可以升级到Java EE 6…:-/它真的是在Jmockit 1.40中添加的还是会添加?