gpt4 book ai didi

java - 在对 Play 2.0 的 fakeRequest 的后续 Java 调用中保持 session

转载 作者:搜寻专家 更新时间:2023-10-31 19:34:39 26 4
gpt4 key购买 nike

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

基于 Scala 问题 Add values to Session during testing (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()));
}

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

java.lang.NoSuchMethodError: 
play.api.mvc.Session.decodeFromCookie(Lscala/Option;)Lplay/api/mvc/Session;

作为一个完全的 Scala 新手,我真的不知道我是否接近。 Scala session does expose (trait) that method through CookieBaker ,我认为

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

@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
}
});
}

对于 1.x,Playframework Secure module: how do you “log in” to test a secured controller in a FunctionalTest?有帮助,但在 2.0 中情况似乎发生了变化,我从未使用过 1.x。

最佳答案

毕竟不需要太多魔法。下面简单地保留设置 cookie 的 HTTP header ,并在下一个请求中传递它:

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"));

(有关仅获取 PLAY_SESSION cookie 并对其进行解析的一些信息,请参阅此答案的 the first version。不过这几乎不需要。)

关于java - 在对 Play 2.0 的 fakeRequest 的后续 Java 调用中保持 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9875572/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com