用于String的Hamcrest匹配器,其中String包含一些随机值

时间:2011-12-21 10:17:11

标签: java jmock matcher hamcrest

有没有办法将以下字符串与任何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}")))

3 个答案:

答案 0 :(得分:3)

也许最优雅的方法是使用正则表达式,尽管它没有内置的匹配器。但是,you can easily write your own

或者,您可以将startsWith()endsWith()allOf()合并。

答案 1 :(得分:3)

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

答案 2 :(得分: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\\}")
);

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