单元测试中的 Play Framework csrf 令牌生成

Play Framework csrf token generation in unit test

我有两个单元测试因“[RuntimeException:缺少 CSRF 令牌]”而失败:

running(testServer(3333, provideFakeApplication()), () -> {
    assertThat(WS.url("http://localhost:3333").get().get(3000).getStatus()
                ).isEqualTo(OK);

running(testServer(3333, provideFakeApplication()), HTMLUNIT, browser -> {
    browser.goTo("http://localhost:3333");
    assert....

如何将带有 CSRF 令牌的会话添加到 WS.url 和 browser.goTo?

测试正在尝试访问具有表单的页面。

一个全局解决方案是使用启用了 CSRF 过滤器的假应用程序。为此,您需要修改(即创建一个继承自 WithApplication 并覆盖的 class)您的 provideFakeApplication(),例如它会创建传入全局设置的假应用程序:

public abstract class TestWrapper extends WithApplication {
    public class GlobalTestSettings extends play.GlobalSettings {
        @Override
        public <T extends EssentialFilter> Class<T>[] filters() {
            return new Class[] { CSRFFilter.class };
        }
    }

    @Override
    protected FakeApplication provideFakeApplication() {
        stop(fakeApplication()); // Stop the existing fake app and start over
        Map<String, String> addConfig = new HashMap<>();
        return fakeApplication(addConfig, new GlobalTestSettings());
    }
}