java - 使用假 session 测试 Controller

标签 java testing playframework-2.1

我想为我的 Controller 编写测试:

Result changeAction = callAction(controllers.routes.ref.Users.changePassword());
assertThat(status(changeAction)).isEqualTo(OK);

我有一个 http 状态代码 - 300。

没错,它是重定向,因为我有一个名为 Secured 的类

package controllers;

import play.mvc.*;
import play.mvc.Http.*;

public class Secured extends Security.Authenticator {

    @Override
    public String getUsername(Context ctx) {
        return ctx.session().get("userId");
    }

    @Override
    public Result onUnauthorized(Context ctx) {
        return redirect(routes.Users.login(ctx.request().uri()));
    }


}

当我对 Controller 方法使用 @Security.Authenticated(Secured.class) 注释时,如果与“userId”的 session 不存在,它会重定向。

所以问题是,我怎样才能伪造 session ?

我显然尝试调用 Controller.session("usderId", "2");

并得到一个异常(exception):

java.lang.RuntimeException: There is no HTTP Context available from here.

    at play.mvc.Http$Context.current(Http.java:30)
    at play.mvc.Controller.session(Controller.java:54)
    at play.mvc.Controller.session(Controller.java:61)
    at controllers.UsersTest.testUnloginedChangePassword(UsersTest.java:35)

我的问题是:如何为 Controller 伪造 session ?

还有一个问题:如何在不使用已弃用的 API 的情况下测试路由,例如 Result result = routeAndCall(fakeRequest(GET, "/change_password"));

最佳答案

可以使用fakeRequestwithSession(String, String)方法将东西放到Session中。请注意,这会返回一个 fakeRequest,因此如果您需要在 session 中放置多个 key ,您可以链接该方法。

你的测试看起来像这样:

@Test
public void test() {
   running(fakeApplication(), new Runnable() {
       public void run() {
           String username = "Aerus";
           Result res = route(fakeRequest("GET", "/")
                            .withSession("username", username)
                            .withSession("key","value"));
           assert(contentAsString(res).contains(username));
       }
   });
}

另请注意,我使用的是 route 方法而不是 routeAndCall,首先是替换已弃用的方法。

关于java - 使用假 session 测试 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17007522/

相关文章:

java - spring boot xa事务数据源和jms

java - 从当前包中获取文件

ruby - 在 Rails 中测试大量外部 API

spring - 用 Spring 玩框架 2.1

playframework - Play 2.x 中是否存在 'configuration environments'?

java - 如何向最终用户显示 API 的错误消息?

java - Maven 不能与 JAVA_HOME 版本一起运行,为什么?

android - 如何显示 Android Robotium 测试的进度对话框 :

java - 如何对具有相同数据的不同类的两个对象进行单元测试?

json - 2.1 Scala JsValue转Java ObjectNode