如何将node.js合并到java测试中?

时间:2014-03-02 00:32:56

标签: java javascript node.js rest testing

我正在查看Mercado Libre Java SDK,我注意到他们的存储库中有一个名为“mockapi”的文件夹。看起来他们在javascript中编写了一个完整的模拟API,用于测试他们的Java客户端。但是,我仍然不太明白它是如何工作的。我已经发布了他们用来执行此操作的app.js中的部分javascript。

var express = require('express');
var fs = require('fs');

var app = express.createServer();

app.configure(function(){
    app.use(express.methodOverride());
    app.use(express.bodyParser());
});

app.post('/oauth/token', function(req, res) {
    if(req.query["grant_type"]=="authorization_code") {
        if(req.query["code"]=="bad code") {
            res.send({"message":"Error validando el parámetro   code","error":"invalid_grant","status":400,"cause":[]}, 400);
        } else if(req.query["code"]=="valid code without refresh token") {
            res.send({
                   "access_token" : "valid token",
                   "token_type" : "bearer",
                   "expires_in" : 10800,
                   "scope" : "write read"
            });
        } else if(req.query["code"]=="valid code with refresh token") {
            res.send({
                   "access_token" : "valid token",
                   "token_type" : "bearer",
                   "expires_in" : 10800,
                   "refresh_token" : "valid refresh token",
                   "scope" : "write read"
            });
        } else {
            res.send(404);
        }
    } else if(req.query['grant_type']=='refresh_token') {
        if(req.query['refresh_token']=='valid refresh token') {
            res.send({
                   "access_token" : "valid token",
                   "token_type" : "bearer",
                   "expires_in" : 10800,
                   "scope" : "write read"
            });
        }
    }
});

app.listen(3000);

fs.writeFileSync('/tmp/mockapi.pid', process.pid);

此外,在查看他们的文件package.json后,看起来他们正在使用节点。该文件列在下面。

{
    "name": "mockapi",
    "version": "1.0.0",
    "dependencies": {
        "express" : "2.5.x"
    },
    "engine": "node ~> 0.8.x"
}

然而,在查看他们的pom文件之后,它看起来并不像他们将Node作为依赖。我主要完成了Java开发,所以服务器端Javascript对我来说仍然很陌生。这是如何工作的?为什么他们不必在POM文件中包含依赖项?我还应该注意,大多数测试都失败了,因为我无法与localhost:3000建立连接。我是否必须安装node.js才能运行测试?

编辑:我添加了Junit测试,测试下面的帖子以及其他一些测试

package com.mercadolibre.sdk;

import java.io.IOException;

import org.junit.Assert;
import org.junit.Test;

import com.ning.http.client.FluentStringsMap;
import com.ning.http.client.Response;

public class MeliTest extends Assert {
@Test
public void testGetAuthUrl() {
assertEquals(
    "https://auth.mercadolibre.com.ar/authorization?response_type=code&client_id=123456&redirect_uri=http%3A%2F%2Fsomeurl.com",
    new Meli(123456l, "client secret")
        .getAuthUrl("http://someurl.com"));
}

@Test(expected = AuthorizationFailure.class)
public void testAuthorizationFailure() throws AuthorizationFailure {
Meli.apiUrl = "http://localhost:3000";

new Meli(123456l, "client secret").authorize("bad code",
    "http://someurl.com");
}

@Test
public void testAuthorizationSuccess() throws AuthorizationFailure {
Meli.apiUrl = "http://localhost:3000";

Meli m = new Meli(123456l, "client secret");
m.authorize("valid code with refresh token", "http://someurl.com");

assertEquals("valid token", m.getAccessToken());
assertEquals("valid refresh token", m.getRefreshToken());
}

@Test
public void testGetWithRefreshToken() throws MeliException, IOException {
Meli.apiUrl = "http://localhost:3000";

Meli m = new Meli(123456l, "client secret", "expired token",
    "valid refresh token");

FluentStringsMap params = new FluentStringsMap();
params.add("access_token", m.getAccessToken());
Response response = m.get("/users/me", params);

assertEquals(200, response.getStatusCode());
assertFalse(response.getResponseBody().isEmpty());
}

public void testPost() throws MeliException {
Meli m = new Meli(123456l, "client secret", "valid token");

FluentStringsMap params = new FluentStringsMap();
params.add("access_token", m.getAccessToken());
Response r = m.post("/items", params, "{\"foo\":\"bar\"}");

assertEquals(201, r.getStatusCode());
}

2 个答案:

答案 0 :(得分:1)

对您的问题的简短回答是,您需要安装节点,并使其在您的路径中可用,以便运行测试。这就是为什么你没有在3000上获得连接。

您对“不确定如何运作”的评论 - 简短的回答是,节点中运行的javascript代码本身就是一个Web服务器。 Node不像你习惯使用Tomcat,Glassfish等那样容器。一般来说,你上面粘贴的Javascript代码使用Express(最广泛使用的节点web框架,连同Connect)创建了一个Web服务器给你一些Servlet API所做的事情。创建的服务器响应单一类型的请求,即/oauth/token的POST。

答案 1 :(得分:0)

  

这是如何正常工作的?

看起来javascript被设计为模拟服务器;即响应被测试的客户端库代码发送的请求。您添加的单元测试似乎正在这样做。

  

为什么他们不必在POM文件中包含依赖项?

目的是您应该手动设置测试服务器,以便运行那些测试。此外,对于必须安装和启动以进行单元测试的(非Java)软件声明Maven依赖是没有意义的。

(你可能会让Maven做那种事情,但我不确定这是个好主意。显然,项目开发人员还没有这样做......)

Makefile支持这一理论。

  

我是否必须安装node.js才能运行测试?

我建议你试试看看......和/或阅读并理解Makefile及其意义。


但是说真的,你应该问作者的这些问题。 README文件说:

  

“如果您对使用开发者网站中描述的标准沟通渠道有疑问,可以与我们联系”

并且有一个指向该网站的链接。

一旦你弄明白了,就向他们发送一个拉取请求,通过记录测试程序来改进他们的开发人员文档。