Mockito «когда» с репозиторием JPA с помощью метода поиска IgnoreCase

#java #regex #unit-testing #jpa #mockito

Вопрос:

Я пытаюсь издеваться над своим пользовательским репозиторием, который не учитывает регистр… и mockito возвращает объект там, где он не должен…

     Pattern adminPattern = Pattern.compile(Pattern.quote("admin"), Pattern.CASE_INSENSITIVE);
    Pattern admin2Pattern = Pattern.compile(Pattern.quote("admin2"), Pattern.CASE_INSENSITIVE);

    Mockito.when(userRepo.findByUserNameIgnoreCase(Mockito.matches(adminPattern))).thenReturn(user1);
    Mockito.when(userRepo.findByUserNameIgnoreCase(Mockito.matches(admin2Pattern))).thenReturn(user2);

    Assert.isTrue(adminPattern.matcher("admin").matches(), "admin should match");
    Assert.isTrue(adminPattern.matcher("adMIN").matches(), "adMIN should match");
    Assert.isTrue(admin2Pattern.matcher("admin2").matches(), "admin2 should  match");
    Assert.isTrue(admin2Pattern.matcher("adMIN2").matches(), "adMIN2 should  match");

    Assert.isTrue(!adminPattern.matcher("admin3").matches(), "admin3 should not match");
    Assert.isTrue(!admin2Pattern.matcher("adMIN").matches(), "adMIN should not match");
    Assert.isTrue(!admin2Pattern.matcher("adMIN3").matches(), "adMIN3 should not match");

    Assert.isTrue(userRepo.findByUserNameIgnoreCase("admin").equals(user1), "Admin must be found");
    Assert.isTrue(userRepo.findByUserNameIgnoreCase("adMIN").equals(user1), "Admin must be found");
    Assert.isNull(userRepo.findByUserNameIgnoreCase("anything"), "anything must not be found");

    Assert.isNull(userRepo.findByUserNameIgnoreCase("admin3"), "Admin3 must not be found");
 

Последняя строчка идет не так… Mockito возвращает user1 вместо ничего.
Мне кажется, что «совпадения» на самом деле являются «началом», что меня немного удивляет…
Или мой сопоставитель шаблонов регулярных выражений ошибочен… Или мне не хватает чего-то еще действительно очевидного (для других: -))

Большое спасибо за некоторые идеи!

Ответ №1:

Если вы посмотрите на org.mockito.internal.matchers.Matches класс at, вы заметите , что он вызывает find , а не matches сопоставляет шаблоны регулярных выражений.

 @Override
public boolean matches(Object actual) {
    return (actual instanceof String) amp;amp; pattern.matcher((String) actual).find();
}
 

Разница в том, что:

  • find ищет появление шаблона во входной строке
  • matches пытается сопоставить все входные данные с шаблоном.

Чтобы принудительно сопоставить все входные данные, вы можете немного изменить свой шаблон: "^admin$"

Комментарии:

1. Если я также удалю свой «Шаблон.цитата», он будет работать так, как ожидалось, большое спасибо!