对 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;
    }
}

不知道你要不要更进一步...

希望对你有帮助, 蒂埃里