我通过Stackoverflow搜索了我的问题的答案,发现了一些非常类似的问题,但没有答案。
我想做什么: 创建一个简单的junit测试,启动Glassfish 4.1嵌入式容器,并测试EJB的简单操作。
示例EJB:
@Stateless
@LocalBean
public class ExampleBean {
public int meaningOfLife() {
return 42;
}
}
非常简单。 这是我的单元测试:
public class BasicTest {
@EJB
private ExampleBean examplebean;
private static Context context;
private static EJBContainer container;
@BeforeClass
public static void init() {
Map<String,Object> props = new HashMap<String,Object>();
//props.put(EJBContainer.MODULES, new File("target/classes"));
props.put(EJBContainer.MODULES, new File("D:\\Development\\IDE\\workspace-templates\\jee7-template\\template-service\\target"));
try {
container = EJBContainer.createEJBContainer(props);//.getContext().bind("inject", this);
context = container.getContext();
} catch (Exception e) {
e.printStackTrace();
}
}
}
我的pom.xml依赖项:
<dependency>
<groupId>org.glassfish.main.extras</groupId>
<artifactId>glassfish-embedded-static-shell</artifactId>
<version>4.1</version>
<scope>system</scope>
<systemPath>D:\\Development\\Servers\\glassfish4.1-activiti\\glassfish\\lib\\embedded\\glassfish-embedded-static-shell.jar</systemPath>
</dependency>
我还尝试添加以下依赖项:
<dependency>
<groupId>org.glassfish.main.ejb</groupId>
<artifactId>ejb-container</artifactId>
<version>4.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.ejb</groupId>
<artifactId>javax.ejb-api</artifactId>
<version>3.2</version>
<scope>test</scope>
</dependency>
结果如下: 嵌入式GF 4.1容器无法加载那个简单的EJB(在maven编译之后它存在于target / classes文件夹中)。
我根据不同的代码更改得到以下错误(比如使用属性传递给容器):
GF 4.1 Embedded UnsatisfiedDependencyException
GF 4.1 Embedded Can't deploy EJB classes
我粘贴的代码是链接的最后一条错误消息。
我不明白。我到处寻找信息,说这应该有效。
另外,如果我尝试使用OpenEJB容器(遗憾的是它只是jee6),它可以正常工作。
<dependency>
<groupId>org.apache.openejb</groupId>
<artifactId>openejb-core</artifactId>
<version>4.7.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.openejb</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0-6</version>
<scope>test</scope>
</dependency>
感谢您的帮助!
答案 0 :(得分:0)
可能不是问题的答案,而是对单元测试EJB的一些更一般的想法:
正如名称所说,单元测试应该只测试单元本身,仅此而已。由于EJB 3.x bean是POJO,因此您只需编写一个简单的JUnit测试,而无需(嵌入式)容器。关于对其他bean的引用,使用像Mockito之类的框架来模拟它们。
在进行集成测试时,您希望多个EJB进行交互,可能与数据库协作,那么您需要容器,例如:有依赖注入。您可以在此处使用嵌入式容器,但也可以使用Arquillian之类的框架,因为您可以使用真正的容器。
答案 1 :(得分:0)
我想我找到了解决问题的方法(目前似乎有效,但我不确定,如果这是真的那个)。
纠正了依赖关系:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish.main.common</groupId>
<artifactId>simple-glassfish-api</artifactId>
<version>4.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish.main.extras</groupId>
<artifactId>glassfish-embedded-static-shell</artifactId>
<version>4.1</version>
<scope>system</scope>
<systemPath>D:\\Development\\Servers\\glassfish4.1-activiti\\glassfish\\lib\\embedded\\glassfish-embedded-static-shell.jar</systemPath>
</dependency>
所以真正缺少的是org.glassfish.main.common / simple-glassfish-api jar(不太确定为什么这是我问题的解决方案)。
这是固定代码:
public class BasicTest {
@EJB
private ExampleBean examplebean;
private Context context;
private EJBContainer container;
@Before
public void init(){
try {
container = EJBContainer.createEJBContainer();
context = container.getContext();
context.bind("inject", this);
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
public void testmeaning() throws NamingException{
if(examplebean == null){
examplebean = (ExampleBean) context.lookup("java:global/classes/ExampleBean");
}
assertEquals(42, examplebean.meaningOfLife());
}
}
使用@BeforeClass的静态成员
public class BasicTest {
@EJB
private ExampleBean examplebean;
private static Context context;
private static EJBContainer container;
@BeforeClass
public static void init() {
container = EJBContainer.createEJBContainer();
context = container.getContext();
}
@Test
public void testmeaning() throws NamingException {
if (examplebean == null) {
examplebean = (ExampleBean) context.lookup("java:global/classes/ExampleBean");
}
assertEquals(42, examplebean.meaningOfLife());
}
}