java - Jersey 客户端策略在登录后测试主页

标签 java rest servlets jersey jax-rs

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

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

由于主页上没有用户名和密码,如何编写客户端代码来验证用户登录成功后是否将正确的内容渲染到主页上?

最佳答案

一种方法是使用 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>

关于java - Jersey 客户端策略在登录后测试主页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31686473/

相关文章:

java - 导航到上一个 Activity

rest - 为订阅调用 PayPal REST API 执行 URL 时到底发生了什么

asp.net - RESTful POST 重试响应

wcf - WCF、Rest 和 SOAP 之间是什么关系?

java - 使用 java servlet 将数据从一个 html 页面传递到另一页面

java - 当我运行 Atmosphere 样本的 Atmosphere 聊天多房间时,@Message注释不起作用

java - Selenium 3.3.1 : NoDefClassFound (com. google.common.base.Function)

java - getScaledInstance java Image 后的高度和宽度 -1

Java - 将变量内容设置为新变量名称

java - 重定向到同一页面会导致空白页面