Arquillian在多个Testmethods中重用RequestScoped Beans

时间:2015-11-24 15:13:01

标签: java java-ee java-ee-6 jboss-arquillian tomee

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

根据arquillian documentation,请求范围的bean实例只应用于一个testmethod。不幸的是,在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"); 
    }
}

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

2 个答案:

答案 0 :(得分:4)

你的考试中有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>元素仅配置(不选择)已选择的协议。如果没有选择使用协议 <defaultProtocol>,然后使用容器的默认值。

答案 1 :(得分:0)

默认情况下,tomee embedded使用本地协议使嵌入式案例受益,因此您不必在测试方法之间拥有独立请求。使用servlet协议解决了它。另一种方法是使用deltaspike cdictrl在@ Before / @ After hooks之后启动/停止请求范围。