Arquillian 在多个测试方法中重用 RequestScoped Bean

Dan*_*sen 3 java java-ee-6 jboss-arquillian apache-tomee jakarta-ee

我的 JEE 6 应用程序使用 CDI 以及带有嵌入式 tomee (1.7.2) 的 Arquillian 来测试它。在具有多个测试方法的测试类中,同一个 Request Scoped Bean 实例被注入到多个测试方法中。当应用程序部署在独立的 tomee plus 1.7.2 上时,不会出现该问题。

根据arquillian 文档,请求范围的 bean 实例只能用于一种测试方法。不幸的是 tomee 嵌入了自己,Arquillian 文档中没有提到它。这是 tomee 嵌入的已知限制吗?如果没有,如何修复?

服务等级:

@RequestScoped
public class SomeService
{
    private String user;

    public String execute(final String pNewUser)
    {
        if(user == null){
            user = pNewUser;
        } 
        return user;
    }
}
Run Code Online (Sandbox Code Playgroud)

测试级:

@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"); 
    }
}
Run Code Online (Sandbox Code Playgroud)

执行的第一个测试成功,第二个测试失败。

dds*_*dds 5

arquillian.xml你的测试中有吗?它应该有

<defaultProtocol type="Servlet 3.0" />
Run Code Online (Sandbox Code Playgroud)

激活请求范围迭代。您可能还需要将以下依赖项添加到您的测试中:

<dependency>
    <groupId>org.jboss.arquillian.protocol</groupId>
    <artifactId>arquillian-protocol-servlet</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

请注意,添加<protocol type="Servlet 3.0" /><container>元素仅配置(不选择)已选择的协议。如果使用 未选择协议 <defaultProtocol>,则使用容器的默认协议。