有没有办法将以下字符串与任何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}")))
答案 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中的正则表达式字符,因此必须在匹配字符串中转义。