对 Restlet 提取器进行单元测试
Unit testing a Restlet extractor
我正在寻找有关 Restlet 组件(尤其是提取器)的实际单元测试的指导。关于 运行 JUnit 有很多关于休息整个端点的建议,但挑剔这不是单元测试,而是集成测试。我真的不想设置整个路由系统和 Spring 只是为了根据模拟数据存储库检查提取器。
提取器如下所示:
public class CaseQueryExtractor extends Extractor {
protected int beforeHandle(Request request, Response response) {
extractFromQuery("offset", "offset", true);
extractFromQuery("limit", "limit", true);
// Stuff happens...
attributes.put("query", query);
return CONTINUE;
}
}
我认为 Restlets 的部分优点在于其良好的路由模型应该使单元测试变得容易,但我无法弄清楚我需要做什么才能实际练习 extractFromQuery
及其朋友们,以及我构建查询对象的所有逻辑,没有模拟太多以至于我失去了针对真实网络请求的测试。
是的,我正在使用 Spring,但我不想为此设置整个上下文——我不是在进行集成测试,因为我还没有真正完成应用程序.我很乐意手动注入,一旦我知道我需要做什么来调用这个方法。
这是我现在所在的位置:
public class CaseQueryExtractorTest {
private class TraceRestlet extends Restlet {
// Does snothing, but prevents warning shouts
}
private CaseQueryExtractor extractor;
@Before
public void initialize() {
Restlet mock = new TraceRestlet();
extractor = new CaseQueryExtractor();
extractor.setNext(mock);
}
@Test
public void testBasicExtraction() {
Reference reference = new Reference();
reference.addQueryParameter("offset", "5");
reference.addQueryParameter("limit", "3");
Request request = new Request(Method.GET, reference);
Response response = extractor.handle(request);
extractor.handle(request, response);
CaseQuery query = (CaseQuery) request.getAttributes().get("query");
assertNotNull(query);
}
}
这当然失败了,因为我正在做的任何设置都不足以让 Restlets 能够提取查询参数。
有什么想法或建议吗?
Restlet 中有一个测试模块,可以为您提供一些有关单元测试的提示。参见 https://github.com/restlet/restlet-framework-java/tree/master/modules/org.restlet.test/src/org/restlet/test。
你可以看看classHeaderTestCase
(见https://github.com/restlet/restlet-framework-java/blob/master/modules/org.restlet.test/src/org/restlet/test/HeaderTestCase.java)。
有关信息,如果您使用请求中的属性,您的单元测试将通过 ;-) 请参见下文:
public class CaseQueryExtractor extends Extractor {
protected int beforeHandle(Request request, Response response) {
extractFromQuery("offset", "offset", true);
extractFromQuery("limit", "limit", true);
// Stuff happens...
CaseQuery query = new CaseQuery();
Map<String,Object> attributes = request.getAttributes();
attributes.put("query", query);
return CONTINUE;
}
}
不知道你要不要更进一步...
希望对你有帮助,
蒂埃里
我正在寻找有关 Restlet 组件(尤其是提取器)的实际单元测试的指导。关于 运行 JUnit 有很多关于休息整个端点的建议,但挑剔这不是单元测试,而是集成测试。我真的不想设置整个路由系统和 Spring 只是为了根据模拟数据存储库检查提取器。
提取器如下所示:
public class CaseQueryExtractor extends Extractor {
protected int beforeHandle(Request request, Response response) {
extractFromQuery("offset", "offset", true);
extractFromQuery("limit", "limit", true);
// Stuff happens...
attributes.put("query", query);
return CONTINUE;
}
}
我认为 Restlets 的部分优点在于其良好的路由模型应该使单元测试变得容易,但我无法弄清楚我需要做什么才能实际练习 extractFromQuery
及其朋友们,以及我构建查询对象的所有逻辑,没有模拟太多以至于我失去了针对真实网络请求的测试。
是的,我正在使用 Spring,但我不想为此设置整个上下文——我不是在进行集成测试,因为我还没有真正完成应用程序.我很乐意手动注入,一旦我知道我需要做什么来调用这个方法。
这是我现在所在的位置:
public class CaseQueryExtractorTest {
private class TraceRestlet extends Restlet {
// Does snothing, but prevents warning shouts
}
private CaseQueryExtractor extractor;
@Before
public void initialize() {
Restlet mock = new TraceRestlet();
extractor = new CaseQueryExtractor();
extractor.setNext(mock);
}
@Test
public void testBasicExtraction() {
Reference reference = new Reference();
reference.addQueryParameter("offset", "5");
reference.addQueryParameter("limit", "3");
Request request = new Request(Method.GET, reference);
Response response = extractor.handle(request);
extractor.handle(request, response);
CaseQuery query = (CaseQuery) request.getAttributes().get("query");
assertNotNull(query);
}
}
这当然失败了,因为我正在做的任何设置都不足以让 Restlets 能够提取查询参数。
有什么想法或建议吗?
Restlet 中有一个测试模块,可以为您提供一些有关单元测试的提示。参见 https://github.com/restlet/restlet-framework-java/tree/master/modules/org.restlet.test/src/org/restlet/test。
你可以看看classHeaderTestCase
(见https://github.com/restlet/restlet-framework-java/blob/master/modules/org.restlet.test/src/org/restlet/test/HeaderTestCase.java)。
有关信息,如果您使用请求中的属性,您的单元测试将通过 ;-) 请参见下文:
public class CaseQueryExtractor extends Extractor {
protected int beforeHandle(Request request, Response response) {
extractFromQuery("offset", "offset", true);
extractFromQuery("limit", "limit", true);
// Stuff happens...
CaseQuery query = new CaseQuery();
Map<String,Object> attributes = request.getAttributes();
attributes.put("query", query);
return CONTINUE;
}
}
不知道你要不要更进一步...
希望对你有帮助, 蒂埃里