我正在查看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());
}
答案 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文件说:
“如果您对使用开发者网站中描述的标准沟通渠道有疑问,可以与我们联系”
并且有一个指向该网站的链接。
一旦你弄明白了,就向他们发送一个拉取请求,通过记录测试程序来改进他们的开发人员文档。