0

由于我一直在运行的一些集成测试,我的构建一直失败。我被困在为什么它不起作用。以下是输出示例:

在此处输入图像描述

我使用 Maven 首先构建,然后调用 JUnit 测试。我401 Unauthorized在每次测试中都看到了这条消息,我相信这就是导致构建失败的原因。在我看来,这意味着需要设置一些权限/身份验证参数。在 JUnit 中我会去哪里做这件事?

编辑

@Test
public void testXmlHorsesNonRunners() throws Exception {
    String servletUrl = SERVER + "sd/date/2013-01-13/horses/nonrunners";
    Document results = issueRequest(servletUrl, APPLICATION_XML, false);
    assertNotNull(results);
    // debugDocument(results, "NonRunners");
    String count = getXPathStringValue(
            "string(count(hrdg:data/hrdg:meeting/hrdg:event/hrdg:nonrunner/hrdg:selection))",
            results);
    assertEquals("non runners", "45", count);
}

如果可以,请尝试忽略细节。实际上,这是在发出请求。这是使用该issueRequest方法的测试样本。这种方法是发出 HTTP 请求的原因。(这是一个很大的方法,这就是为什么我最初没有发布它的原因。我会尽量使其具有可读性。

logger.info("Sending request: " + servletUrl);
    HttpGet httpGet = null;
    // InputStream is = null;
    DefaultHttpClient httpclient = null;

    try {
        httpclient = new DefaultHttpClient();
        doFormLogin(httpclient, servletUrl, acceptMime, isIrishUser);

        httpGet = new HttpGet(servletUrl);
        httpGet.addHeader("accept", acceptMime);
        // but more importantly now add the user agent header
        setUserAgent(httpGet, acceptMime);

        logger.info("executing request" + httpGet.getRequestLine());

        // Execute the request
        HttpResponse response = httpclient.execute(httpGet);

        // Examine the response status
        StatusLine statusLine = response.getStatusLine();
        logger.info(statusLine);

        switch (statusLine.getStatusCode()) {
        case 401:
            throw new HttpResponseException(statusLine.getStatusCode(),
                    "Unauthorized");
        case 403:
            throw new HttpResponseException(statusLine.getStatusCode(),
                    "Forbidden");
        case 404:
            throw new HttpResponseException(statusLine.getStatusCode(),
                    "Not Found");
        default:
            if (300 < statusLine.getStatusCode()) {
                throw new HttpResponseException(statusLine.getStatusCode(),
                        "Unexpected Error");
            }
        }

        // Get hold of the response entity
        HttpEntity entity = response.getEntity();

        Document doc = null;
        if (entity != null) {
            InputStream instream = entity.getContent();
            try {
                // debugContent(instream);
                doc = documentBuilder.parse(instream);
            } catch (IOException ex) {
                // In case of an IOException the connection will be released
                // back to the connection manager automatically
                throw ex;
            } catch (RuntimeException ex) {
                // In case of an unexpected exception you may want to abort
                // the HTTP request in order to shut down the underlying
                // connection and release it back to the connection manager.
                httpGet.abort();
                throw ex;
            } finally {
                // Closing the input stream will trigger connection release
                instream.close();
            }
        }
        return doc;
    } finally {
        // Release the connection.
        closeConnection(httpclient);
    }
4

2 回答 2

2

我注意到您的测试输出在错误HTTP/1.1 500 Internal Server Error之前显示了几行。401我想知道根本原因是否隐藏在那里。如果我是您,我会尝试查找有关测试中服务器上发生的错误的更多详细信息,以查看它是否可能导致身份验证问题(可能故障出在某种登录控制器中,还是导致会话被取消?)

或者:看起来您正在使用Apache HttpClient 库在 issueRequest 方法中执行请求。如果您需要在请求中包含身份验证凭据,那将是您需要更改的代码。这是在 HttpClient中进行 HTTP Basic 身份验证的示例,如果有帮助的话。(还有更多示例,如果没有的话。)

(我认为这个问题可能不是 JUnit 特有的。如果您需要做更多的研究,我建议您更多地了解 HttpClient,以及该应用程序期望浏览器发送什么。一种可能性:使用当您手动执行此操作时,Chrome Dev Tools 之类的东西可以查看您与服务器的通信,并查看测试是否有任何重要的事情没有做,或者正在做不同的事情。

一旦你弄清楚了如何登录,@Before在你的 JUnit 测试中的方法中进行登录可能是有意义的。)

于 2013-08-20T15:54:47.823 回答
0

HTTP 权限被拒绝与 JUnit 无关。您可能需要在代码本身中发出请求时设置您的凭据。给我们看一些代码。

此外,单元测试并不是真的要访问互联网。它的目的是测试代码中不应该依赖任何外部因素的小而简洁的部分。集成测试应该涵盖这一点。

如果可以,请尝试使用EasyMockPowerMock模拟您的网络请求,并让它们返回您将从本地资源文件夹(例如 test/resources)加载的资源。

于 2013-08-20T13:32:16.210 回答