Hamcrest matcher для String, где String содержит несколько случайных значений - PullRequest
3 голосов
/ 21 декабря 2011

Есть ли способ сопоставить следующую строку с любым из совпадений подколенного сухожилия.

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

Эта строка передается методу. Я использую ожидания JMock, чтобы соответствовать этому.

Проблема: часть "72e3a446-2fed-4bda-ac35-34e95ab3dc32" является случайно сгенерированным UUID, который генерируется внутри тестируемого метода. Есть ли совпадение Hamcrest String, которое будет соответствовать что-то вроде

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 ]

3 голосов
/ 24 декабря 2011

Похоже на JSON. Почему бы не использовать анализатор JSON?

3 голосов
/ 21 декабря 2011

Пожалуй, самый элегантный способ сделать это - использовать регулярное выражение, хотя для него нет встроенного сопоставителя. Тем не менее, вы можете легко написать свой собственный .

Кроме того, вы можете комбинировать startsWith() и endsWith() с allOf().

1 голос
/ 15 марта 2019

Для любого, кто наткнулся на этот пост, как я: 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, поэтому должны быть экранированы в строке соответствия.

...