4

有没有办法将以下字符串与任何 hamcrest 匹配器匹配。

"{\"messageType\":\"identify\",\"_id\":\"7de9a446-2ced-4bda-af35-81e95ad2dc32\",\"address\":\"192.168.0.0\",\"port\":7070}"

这个字符串被传递给一个方法。我使用 JMock 期望来匹配它。

问题:“72e3a446-2fed-4bda-ac35-34e95ab3dc32”部分是随机生成的UUID,是在被测方法内部生成的。是否有一个 Hamcrest 字符串匹配器可以匹配类似的东西

new StringCompositeMatcher("{\"messageType\":\"identify\",\"_id\":\"", with(any(String.class)), "\"address\":\"192.168.0.0\",\"port\":7070}" )

它必须匹配预期的字符串以"{\"messageType\":\"identify\",\"_id\":\"之后有任何字符串开始,并以",\"address\":\"192.168.0.0\",\"port\":7070}"

编辑:解决方案

with(allOf(new StringStartsWith("{\"messageType\":\"identify\",\"_id\":\""), new StringEndsWith("\",\"address\":\"192.168.0.0\",\"port\":7070}")))
4

3 回答 3

5

也许最优雅的方法是使用正则表达式,尽管它没有内置的匹配器。但是,您可以轻松编写自己的.

或者,您可以将startsWith()andendsWith()与结合使用allOf()

于 2011-12-21T10:28:56.213 回答
3

它看起来像 JSON。为什么不使用 JSON 解析器?

于 2011-12-24T01:27:55.527 回答
1

对于像我这样偶然发现这篇文章的人:hamcrest 2.0 引入了一个新的匹配器:matchesPattern匹配正则表达式模式。以下代码应该可以工作:

依赖:

testCompile "org.hamcrest:hamcrest:2.0"

...

import static org.hamcrest.Matchers.matchesPattern;
import static org.hamcrest.MatcherAssert.assertThat;

...

assertThat(
        "{\"messageType\":\"identify\",\"_id\":\"7de9a446-2ced-4bda-af35-81e95ad2dc32\",\"address\":\"192.168.0.0\",\"port\":7070}",
        matchesPattern("\\{\"messageType\":\"identify\",\"_id\":\"[0-9a-z-]+\",\"address\":\"192.168.0.0\",\"port\":7070\\}")
);

注意:{and}是 java 中的正则表达式字符,因此必须在匹配器字符串中进行转义。

于 2019-03-15T11:29:52.507 回答