试图嘲弄一个消息驱动bean的,但有麻烦的@EJB被注入。该@Resource作品“精”(至少不打破它)。如果我注释掉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)
my mdb.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");
}
}
my mdb test.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);
}
}
par config i.Java
import javax.ejb.Local;
@Local
public interface ParConfigI {
public void testmethod();
}
的问题是,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的升级也将解决这个问题。