我的JEE 6应用使用CDI,以及的Arquillian具有嵌入式tomee(1.7.2)进行测试。在测试级与多个测试方法中,相同的请求范围Bean实例在多个测试方法被注入。当应用程序部署在独立的tomee加1.7.2的问题不存在的。
按照arquillian documentation一个请求范围bean实例只能用于一个TestMethod的。不幸的是tomee嵌入自身的Arquillian文件中也未提及。这是tomee嵌入一个已知的限制?如果没有,如何解决呢?
服务类:
@RequestScoped
public class SomeService
{
private String user;
public String execute(final String pNewUser)
{
if(user == null){
user = pNewUser;
}
return user;
}
}
测试类:
@RunWith(Arquillian.class)
public class TestCase
{
@Inject
private SomeService someService;
@Deployment
public static WebArchive createDeployment()
{
return DefaultMicroDeploymenCreator.createDefaultMicroDeplymentWithFileName("TestCase.war");
}
@Test
public void testFirstTestMethod() throws Exception
{
String username = someService.execute("User A");
Assert.assertEquals(username, "User A");
}
@Test
public void testSecondTestMethod() throws Exception
{
String username = someService.execute("User B");
Assert.assertEquals(username, "User B");
}
}
执行第一测试是成功,第二个失败。
你有arquillian.xml
在你的测试?它应该有
<defaultProtocol type="Servlet 3.0" />
激活请求范围iteraction。你可能还需要以下依赖添加到您的测试:
<dependency>
<groupId>org.jboss.arquillian.protocol</groupId>
<artifactId>arquillian-protocol-servlet</artifactId>
</dependency>
请注意:添加<protocol type="Servlet 3.0" />
到<container>
元素只配置(不选择)已选定的协议。如果没有协议,使用<defaultProtocol>
选择,则使用该容器的默认。
嵌入式tomee使用本地协议,在默认情况下,所以你不必测试方法之间的独立请求权,以造福于嵌入式情况。使用servlet的协议解决它。另一种方法是使用deltaspike cdictrl启动/停止@请求范围前/后@挂钩。