徐昊 · TDD 项目实战 70 讲
徐昊
Thoughtworks 中国区 CTO
18159 人已学习
新⼈⾸单¥98
登录后,你可以任选4讲全文学习
课程目录
已完结/共 88 讲
实战项目二|RESTful开发框架:依赖注入容器 (24讲)
实战项目三|RESTful Web Services (44讲)
徐昊 · TDD 项目实战 70 讲
15
15
1.0x
00:00/00:00
登录|注册

55|RESTful Web Services(19):如何更有效地构造测试数据?

你好,我是徐昊。今天我们继续使用 TDD 的方式实现 RESTful Web Services。

回顾架构愿景与任务列表

目前我们已经实现了 ResourceRouter,整体的架构愿景如下:
目前 UriTemplate 的任务列表为
UriTemplate
匹配无参数的 Uri 模版
如果 Uri 可以与模版匹配,则返回匹配结果
如果 Uri 不能与模版匹配,则返回 Optional.empty
匹配带参数的 Uri 模版
如果 Uri 可以与模版匹配,按照指定参数从 Uri 中提取值
参数可以通过正则表达式指定格式
如果参数重复定义,则抛出异常
模版匹配的结果可以比较大小
如果匹配的非参字符多,则优先(长的优先)
如果匹配的非参数字符一样,匹配的分组多,则优先(参数优先)
如果匹配的分组一样多,指定格式参数匹配多的优先(指定格式参数优先)
代码为:
{
private static final String LeftBracket = "\\{";
private static final String RightBracket = "}";
private static final String VariableName = "\\w[\\w\\.-]*";
private static final String NonBrackets = "[^\\{}]+";
private static final Pattern variable = Pattern.compile(LeftBracket + group(VariableName) +
group(":" + group(NonBrackets)) + "?" + RightBracket);
private static final int variableNameGroup = 1;
private static final int variablePatternGroup = 3;
private static final String defaultVariablePattern = "([^/]+?)";
private final Pattern pattern;
private final List<String> variables = new ArrayList<>();
private int variableGroupStartFrom;
public UriTemplateString(String template) {
pattern = Pattern.compile(group(variable(template)) + "(/.*)?");
variableGroupStartFrom = 2;
}
private String variable(String template) {
return variable.matcher(template).replaceAll(result -> {
String variableName = result.group(variableNameGroup);
String pattern = result.group(variablePatternGroup);
if (variables.contains(variableName))
throw new IllegalArgumentException("duplicate variable " + variableName);
variables.add(variableName);
return pattern == null ? defaultVariablePattern : group(pattern);
});
}
@Override
public Optional<MatchResult> match(String path) {
Matcher matcher = pattern.matcher(path);
if (!matcher.matches()) return Optional.empty();
return Optional.of(new PathMatchResult(matcher));
}
class PathMatchResult implements MatchResult {
private int count;
private Matcher matcher;
private Map<String, String> parameters = new HashMap<>();
public PathMatchResult(Matcher matcher) {
this.matcher = matcher;
this.count = matcher.groupCount();
for (int i = 0; i < variables.size(); i++)
parameters.put(variables.get(i), matcher.group(variableGroupStartFrom + i));
}
@Override
public int compareTo(MatchResult o) {
return 0;
}
@Override
public String getMatched() {
return matcher.group(1);
}
@Override
public String getRemaining() {
return matcher.group(count);
}
@Override
public Map<String, String> getMatchedPathParameters() {
return parameters;
}
}
private static String group(String pattern) {
return "(" + pattern + ")";
}
}

视频演示

进入今天的环节:
00:00 / 00:00
    1.0x
    • 2.0x
    • 1.5x
    • 1.25x
    • 1.0x
    • 0.75x
    • 0.5x
    网页全屏
    全屏
    00:00

    思考题

    RootResource/Resource/ResourceMethod 部分的任务要如何分解?
    欢迎把你的想法分享在留言区,也欢迎把你的项目代码分享出来。相信经过你的思考与实操,学习效果会更好!
    确认放弃笔记?
    放弃后所记笔记将不保留。
    新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
    批量公开的笔记不会为你同步至部落
    公开
    同步至部落
    取消
    完成
    0/2000
    荧光笔
    直线
    曲线
    笔记
    复制
    AI
    • 深入了解
    • 翻译
      • 英语
      • 中文简体
      • 中文繁体
      • 法语
      • 德语
      • 日语
      • 韩语
      • 俄语
      • 西班牙语
      • 阿拉伯语
    • 解释
    • 总结

    本文介绍了如何更有效地构造测试数据,作者通过使用TDD的方式实现RESTful Web Services。文章回顾了架构愿景与任务列表,其中包括UriTemplate的任务列表,以及相关的代码实现。作者还提出了RootResource/Resource/ResourceMethod部分的任务分解,并邀请读者分享他们的想法和项目代码。整体而言,本文着重介绍了RESTful Web Services的实现方式,以及如何更有效地构造测试数据,对于想要深入了解RESTful Web Services实现细节的读者来说,是一篇值得阅读的文章。

    仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
    《徐昊 · TDD 项目实战 70 讲》
    新⼈⾸单¥98
    立即购买
    登录 后留言

    全部留言(1)

    • 最新
    • 精选
    • aoe
      原来通过排序也可以实现策略模式,之前只知道使用HASH实现策略模式
      2022-07-22
    收起评论
    大纲
    固定大纲
    回顾架构愿景与任务列表
    视频演示
    思考题
    显示
    设置
    留言
    1
    收藏
    沉浸
    阅读
    分享
    手机端
    快捷键
    回顶部