2016-12-21 7 views
1

ArgumentMatchers.matches(String regex) существует ... и можно создавать регулярные выражения, которые не соответствуют данным String. Но это далеко не тривиально (несколько потоков в SO).Mockito ArgumentMatchers doesNotMatch?

Неправильно ли я (или неправильно) подумать, что может быть хорошей идеей попросить дизайнеров Mockito взять на себя тяжелую работу и добавить ее в качестве функции? Кажется, что в контексте насмешек и т. Д. Это далеко не исключительный случай использования ...

PS Также, я не понимаю, с ArgumentMatchers.matches как вы говорите «это может быть многострочная строка, с которой мы сравниваем, не беспокойтесь об этом »... не было бы лучше иметь Pattern, а не простой String?

позже

Feature request "расширение" в Mockito HQ (на Github). «bric3» говорит, что следует использовать технику Джеффа Боумана для «не соответствует». Но ему кажется, что идея Pattern стоит задуматься.

Re not(): Mockito-х own documentation говорит: «Использование дополнительных matchers очень благоразумно, потому что они могут повлиять на читаемость теста рекомендуется использовать matchers от Matchers и держать гася и проверка просто..»

Также я нахожу, что должен «возможно обмануть» свой вопрос: How to write a matcher that is not equal to something. Поиск с ретроспективностью всегда проще ...!

позже еще

Большое спасибо Brice для добавления этого так быстро. Обновлено мое gradle.build и ... новое ядро ​​4.1, загруженное из Maven Central и сразу же доступное для использования.

+1

Это будет отличный пост для списка рассылки Mockito. И вы всегда можете сделать запрос функции команде Mockito. Запросы функций обычно вызывают некоторые дебаты внутри команды о том, является ли эта функция хорошей идеей - иногда запрашиваемые функции быстро развиваются, иногда они занимают некоторое время, но в конечном итоге развиваются, а иногда они отвергаются. Но никогда не было никакого вреда в просьбе. –

+0

Спасибо за поддержку. Ответ Джеффа Боумена идет совершенно в другом направлении. AdditionalMatchers.not.Я думаю, что мне, возможно, понадобилось около 13 лет, чтобы наткнуться на это. Вероятно, есть только небольшая группа потенциальных покупателей, но кто-нибудь из вас когда-либо думал о написании книги под названием «Intermediate Mockito» или «Mockito: переход на другой уровень»? –

+0

На самом деле, я начал работу над довольно обширной книгой о Mockito несколько лет назад. Проблема в том, что Mockito растет и меняется быстрее, чем я могу писать, с добавлением новых функций все время. К тому времени, когда я получу публикацию, информация в моей книге будет устаревшей. Поэтому я отказался от проекта. Что мне действительно нужно сделать, так это начать блог и превратить свой материал в серию сообщений - может быть, в другой раз я это сделаю. –

ответ

4

Нет необходимости в запросе: вы можете составить то, что хотите, с помощью AdditionalMatchers.not.

when(yourComponent.acceptString(not(matches("foo|ba[rz]")))) 
    .thenThrow(new IllegalArgumentException()); 

Если вы хотите, чтобы соответствовать шаблону, что вам может понадобиться, чтобы написать свой собственный ArgumentMatcher подкласс, но это довольно легко оттуда:

public class MatchesPattern implements ArgumentMatcher<String> { 
    private final Pattern pattern; 
    public MatchesPattern(Pattern pattern) { this.pattern = pattern; } 

    @Override public boolean matches(String string) { 
    return pattern.matcher(string).matches(); 
    } 

    @Override public String toString() { 
    return "[string matching /" + pattern.toString() + "/]"; 
    } 

    /** Optional. */ 
    public static MatchesPattern matchesPattern(Pattern pattern) { 
    return new MatchesPattern(pattern); 
    } 
} 

Вы можете потреблять этот класс с помощью:

when(yourComponent.acceptString(not(argThat(new MatchesPattern(yourPattern))) 
    .thenThrow(new IllegalArgumentException()); 

// or with the static factory method: 
when(yourComponent.acceptString(not(argThat(matchesPattern(yourPattern))) 
    .thenThrow(new IllegalArgumentException()); 
+0

Блестящий! Спасибо, Джефф, ты - мужик для всех вещей Мокито! –

3

Для будущих читателей Mockito 2.4.1 был выпущен с поддержкой Pattern класс:

Теперь вы должны быть abble написать:

when(yourComponent.acceptString(not(matches(Pattern.compile(...))) 
    .thenThrow(new IllegalArgumentException()); 
+2

Впечатляющие сроки на этом! –

+1

Я был доступен. Также благодаря нашему автоматическому выпуску. – Brice