2013-08-21 2 views
2

Я пишу некоторые пользовательские совпадения, чтобы упростить утверждения junit. Большинство из них распространяется TypeSafeMatcher, так что мне нужно только переопределить три метода:Как проверить пользовательский сопоставитель hamcrest?

public class NoneConstraintViolationMatcher<T> extends 
    TypeSafeMatcher<Set<ConstraintViolation<T>>> { 

    @Override 
    public void describeTo(Description description) { 
     description.appendText("None constraint violations found"); 
    } 

    @Override 
    protected void describeMismatchSafely(Set<ConstraintViolation<T>> item, 
     Description mismatchDescription) { 
     mismatchDescription. 
      appendText("Unexpected constraint violation found, but got "); 
     mismatchDescription.appendValueList("", ",", "", item); 
    } 

    @Override 
    protected boolean matchesSafely(Set<ConstraintViolation<T>> item) { 
     return item.isEmpty(); 
    } 
} 

Мой вопрос заключается в том, чтобы проверить их? Мой текущий решение

public class NoneConstraintViolationMatcherUnitTests { 

    private NoneConstraintViolationMatcher<Object> matcher = 
     new NoneConstraintViolationMatcher<Object>(); 

    @Test 
    public void returnsMatchedGivenNoneConstraintViolations() throws Excetpion { 
     assertTrue(matcher.matches(.....)); 
    } 

    @Test 
    public void returnsMismatchedGivenSomeConstraintViolations() throws Excetpion { 
     assertThat(matcher.matches(.....), is(false)); 
    }   

    @Test 
    public void returnsConstraintViolationsFoundWhenMismatched() 
     throws Exception { 

     StringBuilder out = new StringBuilder(); 
     //I don't find anything could be used to assert in description 

     StringDescription description = new StringDescription(out); 

     matcher.describeMismatch(..someCvx, description); 

     assertThat(out.toString(), 
      equalTo("Unexpected constraint violation found, but got ")); 
    } 
} 

Еще одно решение, которое приходит мне в голову написать тест JUnit и использовать @Rule ExpectedException (с handleAssertionError установлен верно).

Как вы, ребята, проверяете соответствия? Заранее спасибо.

ответ

2

Я использую assertThat для тестирования функциональности матчей.

@Test 
public void returnsMatchedGivenNoneConstraintViolations() throws Excetpion { 
    assertThat(someObject, matcher); 
} 

@Test 
public void returnsMismatchedGivenSomeConstraintViolations() throws Excetpion { 
    assertThat(someObject, not(matcher)); 
} 
+0

Благодарим за отзыв. Легко ли тестировать описание с помощью этого решения? – Hippoom

0

Чтобы ответить на ваш последующий вопрос об испытании описания, я не вижу в этом необходимости. Я считаю, что достаточно написать returnsConstraintViolationsFoundWhenMismatched тест как этого

@Test(expected=Exception.class) 
public void returnsConstraintViolationsFoundWhenMismatched() { 
    // Use the matcher in a way that causes an exception to be thrown 
} 

Важной верификацией является то, что собственно было сгенерировано исключение. Тестирование содержимого фактического сообщения и не добавление какого-либо значения в ваш тестовый пакет. Вы можете просто верить, что библиотека Hamcrest делает правильные вещи с текстом, который вы добавляете к описанию.

+1

У меня есть ситуация, в которой я хотел бы протестировать описание. Это потому, что я проверяю содержимое коллекции и хочу сообщать только о несоответствиях. В частности, я хочу проверить логику (например, петли и условия) описания, а не сгенерированный текст. Логика должна соответствовать логике в методе 'matchesSafely', но не так просто повторить использование логического кода в Java. –

+0

Если логика matchSafely и генерация описания перекрываются, вы можете написать частный метод в классе совпадений Hamcrest для повторного использования кода. Затем, проверяя сопряжение, вы неявно проверяете логику, которая также создает описание. –

+0

Извините, когда я говорю, что логика такая же, я имею в виду условия, а не тела петель и условий. Например, 'matchesSafely' может иметь' if (A) return false; если (B) возвращает false; return true; 'while' describeTo' будет иметь' if (A) description.appendText ("A"); if (B) depscription.appendText ("B"); '. Я предполагаю, что шаблон шаблона шаблона подойдет здесь, но он довольно подробный в Java (pre-Java 8). –

Смежные вопросы