Я ищу способ сохранить сеанс при использовании fakeRequest Play 2.0 в моих тестах Java, но мои попытки терпят неудачу при вызове методов в JAR на основе Scala.
На основании запроса на получение, упомянутого в вопросе Scala Добавление значений в Session во время тестирования (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 раскрывает (черта) этот метод через 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
}
});
}
Для 1.x, Модуль Playframework Secure: как «войти» для проверки защищенного контроллера в FunctionalTest? помогает, но в 2.0 все изменилось, и я никогда не использовал 1 .x.