在后续Java调用Play 2.0的fakeRequest中保持会话

Arj*_*jan 5 java interop scala playframework-2.0

我正在寻找一种在我的Java测试中使用Play 2.0的fakeRequest时保留会话的方法,但是在基于Scala的JAR中调用方法时我的尝试失败了.

根据Scala问题中提到的拉取请求,在测试期间向会话添加值(FakeRequest,FakeApplication),我认为以下内容可能适用于Java:

public Session getSession(Result result) {
  play.api.mvc.Cookies scalaCookies =
      play.api.test.Helpers.cookies(result.getWrappedResult());
  play.api.mvc.Cookie scalaSessionCookie =
      scalaCookies.get(play.api.mvc.Session.COOKIE_NAME()).get();
  scala.Option<play.api.mvc.Cookie> optionalCookie =
      scala.Option.apply(scalaSessionCookie);

  // Compiles fine, but fails with NoSuchMethodError:
  play.api.mvc.Session scalaSession =
      play.api.mvc.Session.decodeFromCookie(optionalCookie);

  return new play.mvc.Http.Session(Scala.asJava(scalaSession.data()));
}
Run Code Online (Sandbox Code Playgroud)

编译得很好,但在运行测试时它让我:

java.lang.NoSuchMethodError: 
  play.api.mvc.Session.decodeFromCookie(Lscala/Option;)Lplay/api/mvc/Session;
Run Code Online (Sandbox Code Playgroud)

作为Scala newby,我真的不知道我是否接近.我认为,Scala会话确实通过CookieBaker公开(特征)该方法.

请注意,我不一定要找到一种方法来运行上面的代码; 以上只是获得会议的第一步(可能).接下来我可能会尝试使用类似的东西play.api.mvc.Session.encodeAsCookie(session)将其传递给后续请求.喜欢ZenTasks演示:

@Test
public void testLoginAndMore() {
  Helpers.running(Helpers.fakeApplication(Helpers.inMemoryDatabase()), 
  new Runnable() {
    public void run() {
      Map<String, String> data = new HashMap<String, String>();
      data.put("email", "guillaume@sample.com");
      data.put("password", "secret");

      Result result = 
        callAction(controllers.routes.ref.Application.authenticate(),
          fakeRequest().withFormUrlEncodedBody(data));
      assertThat(status(result)).isEqualTo(Status.SEE_OTHER);
      assertThat(redirectLocation(result)).isEqualTo("/");

      // All fine; we're logged in. Now somehow preserve the cookie. This
      // does NOT do the trick:
      Session session = getSession(result);
      // ...subsequent callAction(..)s, somehow passing the session cookie 
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

对于1.x,Playframework Secure模块:如何"登录"以测试FunctionalTest中的安全控制器?有帮助,但事情似乎在2.0中发生了变化,我从未使用过1.x.

Arj*_*jan 6

毕竟不需要太大的魔法.以下简单地保留设置cookie的HTTP头,并在下一个请求中传递它:

Map<String, String> data = new HashMap<String, String>();
data.put("email", "guillaume@sample.com");
data.put("password", "secret");

Result result = callAction(controllers.routes.ref.Application.authenticate(),
  fakeRequest().withFormUrlEncodedBody(data));

assertThat(status(result)).isEqualTo(Status.SEE_OTHER);
assertThat(redirectLocation(result)).isEqualTo("/");
// All fine; we're logged in. Preserve the cookies:
String cookies = header(HeaderNames.SET_COOKIE, result);

// Fetch next page, passing the cookies
result = routeAndCall(fakeRequest(GET, redirectLocation(result))
  .withHeader(HeaderNames.COOKIE, cookies));

assertThat(status(result)).isEqualTo(Status.OK);
assertThat(contentAsString(result).contains("Guillaume Bort"));
Run Code Online (Sandbox Code Playgroud)

(请参阅此答案的第一个版本,了解有关仅获取PLAY_SESSIONcookie并解析该信息的一些信息.但这几乎不需要.)