Junit 单元测试中的Play框架csrf令牌生成

Junit 单元测试中的Play框架csrf令牌生成,junit,playframework,csrf,Junit,Playframework,Csrf,我有两个单元测试失败,原因是[RuntimeException:缺少CSRF令牌]: running(testServer(3333, provideFakeApplication()), () -> { assertThat(WS.url("http://localhost:3333").get().get(3000).getStatus() ).isEqualTo(OK); 及 如何将带有CSRF令牌的会话添加到WS.url和browser.g

我有两个单元测试失败,原因是[RuntimeException:缺少CSRF令牌]:

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

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


测试试图到达一个有表单的页面。

全局解决方案是使用启用了CSRF过滤器的假应用程序。为此,您需要修改,即创建一个从WithApplication继承的类,并重写ProviderFakeApplication,例如它创建传入全局设置的假应用程序:

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

你看到了吗?是的,但我需要另一个解决方案。我正在使用结果。使用Session。。。在其他的测试中,效果很好。令人惊叹的还有,有了这个,我就不需要再继续下去了。。。对于假请求也是如此。
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());
    }
}