我怎样才能让一个会话范围的 bean 在 Arquillian 中的多个测试中持续存在?

How can I get a session scoped bean to persist across multiple tests in Arquillian?

我正在尝试使用存储当前用户登录信息的相当简单的 SessionScoped bean 进行 Arquillian 集成测试

@SessionScoped
public class Session
        implements Serializable
{
    private LoginUser loginUser = null;

    // Methods for logging in, getting logged in user, checking privileges, etc.
}

我的测试 class 看起来像这样:

@RunWith(Arquillian.class)
@SessionScoped
public class SessionIntegrationTest
        implements Serializable
{
    private static final long serialVersionUID = 1L;

    @SuppressWarnings("unused")
    private static Logger log = LoggerFactory.getLogger(SessionIntegrationTest.class);

    @Deployment
    public static WebArchive createDeployment()
    {
        PomEquippedResolveStage pom = Maven.resolver().loadPomFromFile("pom.xml");

        File[] guava = pom.resolve("com.google.guava:guava").withTransitivity().asFile();

        WebArchive war = ShrinkWrap.create(WebArchive.class)
                .addPackages(true, "technology.constellation")
                .addAsLibraries(guava)
                .addAsResource("test-persistence.xml", "META-INF/persistence.xml")
                .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");;

        System.out.println(war.toString(true));

        return war;
    }

    @Inject
    private Session session;

    @Test(expected = IllegalStateException.class)
    @InSequence(1)
    public void noLoggedInUser()
    {
        log.info("First test");
        assertEquals(false, session.isLoggedIn());
        session.getCurrentUser();
    }

    @Test
    @InSequence(2)
    public void testLogin() throws AuthenticationException
    {
        session.logIn("admin", "admin", null);
        assertNotNull(session.getCurrentUser());
        assertEquals(true, session.isLoggedIn());
    }

    @Test
    @InSequence(3)
    public void testSessionAcrossRequests()
    {
        assertTrue("Session should still be logged in", session.isLoggedIn());
    }
}

在这个测试中,前两个通过,第三个不通过。测试为每个测试获取一个新的会话 bean。

根据 Arquillian documentation,Session 范围应该在同一个测试 class 中跨测试激活。所以我希望第三次测试能够通过。我尝试过将测试 class 本身注释为 SessionScoped,但没有成功。

任何人都知道如何让它工作,或者这是否可能?

经过大量阅读、测试和搜索(灵魂和其他),我发现文档中指定的范围仅在使用 weld 嵌入式容器时在测试中有效。

不知道为什么它不能与其他人一起工作,但如果他们能做到这一点就好了。