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 升级也可以解决问题。
尝试模拟 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 升级也可以解决问题。