泽西客户端策略登录后测试主页面

时间:2015-07-28 20:30:34

标签: java rest servlets jersey jax-rs

我正在使用Jersey创建一个Web应用程序。目前有两个页面:登录和主页面。当用户输入正确的用户名和密码时,登录页面将被重定向到主页面(否则警告将显示在弹出窗口中,没有重定向)。

在主页面中,从服务器检索某些内容并在页面上更新。

由于主页上没有用户名和密码,如何在用户成功登录后编写客户端代码以修改是否将正确的内容呈现给主页?

2 个答案:

答案 0 :(得分:1)

一种方法是使用HTML解析库,例如jsoup。以下是使用Jersey Test Framework的完整示例。您可以像任何其他单元测试一样运行它

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

import org.junit.Test;
import static junit.framework.Assert.*;

public class HtmlParserTest extends JerseyTest {

    @Path("login")
    public static class LoginController {

        @POST
        @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
        @Produces(MediaType.TEXT_HTML)
        public String doLogin(MultivaluedMap<String, String> formParams) {
            boolean valid = false;
            valid = "user".equals(formParams.getFirst("username"));
            valid = "pass".equals(formParams.getFirst("password"));

            String message = valid ? "You Win!" : "You Lose!";
            String html
                    = "<html>\n"
                    + "    <body>\n"
                    + "        <h1 id=\"message\">" + message + "</h1>\n"
                    + "    </bod;y>\n"
                    + "</html>";
            return html;
        }
    }

    @Override
    public Application configure() {
        return new ResourceConfig(LoginController.class);
    }

    @Test
    public void youWinMessageWithValidCredentials() {
        String message = handleRequest("pass");
        assertEquals("You Win!", message);
    }

    @Test
    public void youLoseMessageWithBadCredentials() {
        String message = handleRequest("wrong");
        assertEquals("You Lose!", message);
    }

    private String handleRequest(String password) {
        Form form = new Form();
        form.param("username", "user");
        form.param("password", password);
        String html = target("login").request()
                .accept(MediaType.TEXT_HTML)
                .post(Entity.form(form), String.class);
        return getMessageContent(html);
    }

    /* jsoup code */
    private String getMessageContent(String html) {
        Document document = Jsoup.parse(html);
        Element messageElem = document.getElementById("message");
        return messageElem.text();
    }
}

以下是测试的依赖关系

<dependency>
    <groupId>org.glassfish.jersey.test-framework.providers</groupId>
    <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
    <scope>${jersey2.version}</scope>
</dependency>
<dependency>
    <!-- jsoup HTML parser library @ http://jsoup.org/ -->
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.8.2</version>
    <scope>test</scope>
</dependency>

答案 1 :(得分:0)

您可以使用Arquillian框架进行此类测试。除了Arquillian Core之外,还有许多扩展版。 对于您的用例,我将使用Arquillian Drone ExtensionREST Extension(如果您在登录后使用了restful服务)。 Arquillian Drone允许您为网站编写客户端测试,其余扩展可以测试restful webservices。

Here是使用Arquillian Drone测试登录页面的示例。