Arquillian 在多个测试方法中重用 RequestScoped Beans
Arquillian reusing RequestScoped Beans in multiple Testmethods
我的 JEE 6 应用程序正在使用 CDI 以及带有嵌入式 tomee (1.7.2) 的 Arquillian 对其进行测试。
在具有多个测试方法的 test-class 中,同一个 Request Scoped Bean 实例被注入多个测试方法。
应用部署在单机tomee plus 1.7.2上不出现该问题
根据 arquillian documentation 请求作用域 bean 实例应该只用于一个测试方法。不幸的是,tomee 嵌入了它自己,它在 Arquillian 文档中没有提到。这是 tomee embedded 的已知限制吗?如果不行,如何解决?
服务Class:
@RequestScoped
public class SomeService
{
private String user;
public String execute(final String pNewUser)
{
if(user == null){
user = pNewUser;
}
return user;
}
}
测试-Class:
@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" />
激活请求范围迭代。
您可能还需要将以下依赖项添加到测试中:
<dependency>
<groupId>org.jboss.arquillian.protocol</groupId>
<artifactId>arquillian-protocol-servlet</artifactId>
</dependency>
请注意,将 <protocol type="Servlet 3.0" />
添加到
<container>
元素仅配置(不 select)已经 selected 的协议。如果没有协议 selected 使用
<defaultProtocol>
,则使用容器的默认值。
tomee embedded 默认使用本地协议以利用嵌入式案例,因此您在测试方法之间没有独立的请求。使用 servlet 协议解决它。替代方法是使用 deltaspike cdictrl start/stop @Before/@After 钩子中的请求范围。
我的 JEE 6 应用程序正在使用 CDI 以及带有嵌入式 tomee (1.7.2) 的 Arquillian 对其进行测试。 在具有多个测试方法的 test-class 中,同一个 Request Scoped Bean 实例被注入多个测试方法。 应用部署在单机tomee plus 1.7.2上不出现该问题
根据 arquillian documentation 请求作用域 bean 实例应该只用于一个测试方法。不幸的是,tomee 嵌入了它自己,它在 Arquillian 文档中没有提到。这是 tomee embedded 的已知限制吗?如果不行,如何解决?
服务Class:
@RequestScoped
public class SomeService
{
private String user;
public String execute(final String pNewUser)
{
if(user == null){
user = pNewUser;
}
return user;
}
}
测试-Class:
@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" />
激活请求范围迭代。 您可能还需要将以下依赖项添加到测试中:
<dependency>
<groupId>org.jboss.arquillian.protocol</groupId>
<artifactId>arquillian-protocol-servlet</artifactId>
</dependency>
请注意,将 <protocol type="Servlet 3.0" />
添加到
<container>
元素仅配置(不 select)已经 selected 的协议。如果没有协议 selected 使用
<defaultProtocol>
,则使用容器的默认值。
tomee embedded 默认使用本地协议以利用嵌入式案例,因此您在测试方法之间没有独立的请求。使用 servlet 协议解决它。替代方法是使用 deltaspike cdictrl start/stop @Before/@After 钩子中的请求范围。