有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Play框架1。使用@AllowFeature控制器方法进行x功能测试

我确实想为我们的项目写一些功能测试。Techstack:PlayFramework1.5、Java16、JUnit3

我发现了以下文档: test - 1.5.x security - 1.5.x

控制器看起来像这样

@AllowFeature(Feature.SEARCH_BOX)
public static void search(String term) {
    //implementation omitted

    TablePage<MyAwesomeType> page = search(term);

    render(..., page, term);
}

我的测试是这样的

public class SearchTest extends FunctionalTest {

    @Test
    public void search_withResults() {
        String term = "ABC";
        Http.Response response = GET("/foo/search?term=" + term);

        assertStatus(302, response);

        assertThat(renderArgs("page"), is(notNullValue()));
        TablePage<MyAwesomeType> page = (TablePage<MyAwesomeType>) renderArgs("page");

        assertTrue(page.getTotalRecords() >= 1);
    }

}

然而,TablePage<MyAwesomeType> page是空的,而实际上它不应该是空的,并且我无法使用调试器进入控制器方法。所以看起来控制器方法search(...)根本没有被调用

响应代码是302 - Found,但我认为这可能是因为它找到了路径/foo/search

我的猜测是,我需要设置一些UserContext或随请求发送一个authenticityToken。因此play可以检查所需的功能@AllowFeature(Feature.A_SEARCH_BOX)

有人知道我如何设置这样的功能测试吗

感谢您的帮助。谢谢


共 (1) 个答案

  1. # 1 楼答案

    我终于弄明白了

    我需要登录应用程序,然后播放FunctionalTest.class来处理cookie

    1. @NoAuthenticity添加到登录方法
    @NoAuthenticity // <  This enables execution without authenticityToken
    public static void login(@Required String username, @Required String password) {
        ... 
    }
    
    1. 在测试前发布登录请求
    @Test
    public void search_withResults() {
        // 1. login
        Map<String, String> credentials = Map.of("username", "MyUsername", "password", "MyPassword");
        POST("/login", credentials); 
        // Note: session info / authenticityToken is stored in a cookie
        // FunctionalTest.class makes sure to use this cookie for subsequent requests
    
        // This request now works like a charm
        String term = "ABC";
        Http.Response response = GET("/foo/search?term=" + term);
    
        assertStatus(302, response);
    
        assertThat(renderArgs("page"), is(notNullValue()));
        TablePage<MyAwesomeType> page = (TablePage<MyAwesomeType>) renderArgs("page");
    
        assertTrue(page.getTotalRecords() >= 1);
    }
    

    注意:可以使用JUnit @Before注释来简化测试类

    @Before
    public void login(){
        Map<String, String> credentials = Map.of("username", "MyUsername", "password", "MyPassword");
        POST("/login", credentials);
    }
    
    @Test
    public void search_withResults() {
        String term = "ABC";
        Http.Response response = GET("/foo/search?term=" + term);
    
        assertStatus(302, response);
    
        assertThat(renderArgs("page"), is(notNullValue()));
        TablePage<MyAwesomeType> page = (TablePage<MyAwesomeType>) renderArgs("page");
    
        assertTrue(page.getTotalRecords() >= 1);
    }
    
    @Test
    public void anotherTest() { ... }
    
    @Test
    public void yetAnotherTest() { ... }