You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Play Framework 1.5 带@AllowFeature注解的控制器功能测试配置问题

Play Framework 1.5 权限接口功能测试配置方案

你的测试返回302是因为请求被@AllowFeature对应的权限拦截器拦截,未进入控制器方法,因此renderArgs中不存在对应参数。按照以下步骤配置即可解决:

1. 前置配置:模拟用户身份与权限

@AllowFeature校验依赖用户权限上下文,需要在测试执行前初始化用户身份、权限以及CSRF令牌:

public class SearchTest extends FunctionalTest {
    @Before
    public void beforeTest() {
        // 初始化会话,注入测试用户标识
        Session session = Session.current();
        session.put("userId", "10001");
        session.put("username", "test_admin");
        
        // 初始化用户上下文,确保用户拥有SEARCH_BOX权限
        UserContext testContext = new UserContext();
        testContext.addPermission(Feature.SEARCH_BOX);
        UserContext.set(testContext);
        
        // 生成并注入authenticityToken,避免CSRF校验拦截
        String csrfToken = Crypto.sign(Long.toString(System.currentTimeMillis()));
        session.put("authenticityToken", csrfToken);
    }
}

2. 修正测试请求逻辑

请求时携带CSRF令牌,同时调整响应码断言(权限通过后接口正常返回应为200而非302):

@Test
public void search_withResults() {
    String term = "ABC";
    String csrfToken = Session.current().get("authenticityToken");
    // 请求路径携带authenticityToken参数
    Http.Response response = GET("/foo/search?term=" + term + "&authenticityToken=" + csrfToken);
    
    // 校验接口正常响应
    assertStatus(200, response);
    assertThat(renderArgs("page"), is(notNullValue()));
    TablePage<MyAwesomeType> page = (TablePage<MyAwesomeType>) renderArgs("page");
    assertTrue(page.getTotalRecords() >= 1);
}

额外注意事项

  • 如果SEARCH_BOX是功能开关控制的能力,需要在测试环境的application.conf中添加对应开关的开启配置,或者在测试代码中手动修改开关状态。
  • 若你项目的CSRF校验是通过请求头传递token,可在调用GET方法时传入自定义请求头,无需拼接在URL参数中。

内容的提问来源于stack exchange,提问作者Emanuel Gitterle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 18:54:04