Как смоделировать Restriction.eq () с помощью Mockito - PullRequest
4 голосов
/ 20 марта 2012

У меня возникли проблемы при создании тестов с помощью Mockito. Во время отладки с Eclipse я получил null от Restrictions.eq, я делал каждый шаг, чтобы создать статический макет для Restrictions:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ RequisicaoList.class, StatusMessages.class,
    FacesMessages.class, Restrictions.class })
public class RequisicaoListTest {

...

@SuppressWarnings("unchecked")
public String criteriaContigencia() {
    Criteria criteria = criarCriteria(Requisicao.class);

    criteria.createAlias("produto", "prod");        
    criteria.add(Restrictions.eq("prod.ar",arSelecionada));

    if (getExemplo().getNrProtocolo() != null)
        criteria.add(Restrictions.eq("nrProtocolo", getExemplo()
                .getNrProtocolo()));

    situacoesPesquisa.clear();
    situacoesPesquisa.add(SituacaoRequisicao.PENDENTE_PAGAMENTO);
    situacoesPesquisa.add(SituacaoRequisicao.PENDENTE_AGENDAMENTO);
    if (!situacoesPesquisa.isEmpty()) {
        criteria.add(Restrictions.in("situacao", situacoesPesquisa));
    }   

    if (getExemplo().getResponsavel() != null && StringUtils.isNotBlank(getExemplo().getResponsavel().getCpf())) {
            criteria = criteria.createCriteria("responsavel");
            criteria = criteria.add(Restrictions.eq("cpf", getExemplo().getResponsavel().getCpf()));
    }

    resultado = Collections.checkedList(criteria.list(),Requisicao.class);

    return null;
}

Мой код смешивает управляемый компонент со слоем постоянства, я не могу этого изменить, но я должен создать тесты для этого проекта.

Проблема здесь в том, чтобы высмеивать

Restrictions.eq("cpf", getExemplo().getResponsavel().getCpf())

потому что даже я делаю:

SimpleExpression simpleExpressionEq = mock(SimpleExpression.class);
PowerMockito.mockStatic(Restrictions.class);
when(Restrictions.eq("cpf", "00000000091")).thenReturn(simpleExpressionEq);

тогда я все еще получаю null возврат от Restriction.eq, даже передавая зрительские значения. Но во время отладки, если я сделаю выражение в представлении выражений, сделав:

Restrictions.eq("cpf", "00000000091"))

Работает нормально и возвращает высмеянное SimpleExpression

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

Я не думаю, что имеет смысл издеваться Restrictions, когда вы тестируете этот метод.Цель этого метода - обернуть доступ к данным (Hibernate и любую базу данных, которую вы используете).Таким образом, полезным тестом для этого метода будет тест, который гарантирует, что вы используете базу данных правильно.

Итак, вместо написания модульного теста, где все проверено, я бы рекомендовал написать интеграционный тест.Используйте базу данных в памяти, такую ​​как H2 (http://h2database.com);), и напишите тест, который устанавливает соответствующие данные, а затем фактически выбирает их. Тогда ваш уровень уверенности в том, что этот метод действительно выполняет то, что он должен делать, будет намного превышать то, чтомодульный тест даст вам.

1 голос
/ 20 марта 2012

Если

Restrictions.eq("cpf", "00000000091"))

возвращается правильно, возможно, проблема в getExemplo().getResponsavel().getCpf(). Вы уверены, что он возвращает «00000000091»? Вы не включили достаточно кода, чтобы сказать, может ли это быть проблемой, но это стоит изучить.

Другим подходом было бы избежать насмешки Restrictions в целом. Когда я хочу сделать что-то подобное, я использую реальный класс Restrictions и позволяю ему вернуть реальный критерий. Я написал простой метод сопоставления toStringEq, который я могу использовать для проверки или проверки поведения объекта Criteria. Конечно, сопоставление по значению объектов toString () не совпадает с сопоставлением по фактическому равенству, но поскольку объекты Criterion используют равенство экземпляров для равенства, но объекты Criterion с одинаковым значением toString () функционально эквивалентны, мы обнаружили, что это очень удобно для этого варианта использования.

Например, после вашего звонка, если у вас есть фиктивный объект Критерии, вы можете иметь:

verify(mockCriteria).add(argThat(toStringEq(Restrictions.eq("cpf", "0000000091"))));

Вот простой класс соответствия:

import org.hamcrest.Description;
import org.mockito.ArgumentMatcher;

public class HamcrestToStringMatcher<T> extends ArgumentMatcher<T> {

    private T toMatch;

    public HamcrestToStringMatcher(T toMatch) {
        this.toMatch = toMatch;
    }

    @Override
    public void describeTo(Description description) {
        description.appendText(toMatch == null ? "null" : toMatch.toString());
    }

    @Override
    public boolean matches(Object argument) {
        return ((toMatch == null && argument == null) || (toMatch != null
                && argument != null && toMatch.toString().equals(
                argument.toString())));
    }

    public static <T> HamcrestToStringMatcher<T> toStringEq(T toMatch) {
        return new HamcrestToStringMatcher<T>(toMatch);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...