Versão ALPHA! Este artigo está em versão 'Alpha' e, portanto, não foi ainda revisado corretamente

Teste

Introdução

Inicialmente é nessário entender as diferenças entre buscadores e filtros. Em um método de um buscador onde a assinatura diz que deve retornar exatame um Alunodado o ID do mesmo, teremos algo assim:

public Aluno porId(AlunoKey key) {
  FaculdadeKey faculdadeKey = key.getFaculdadeKey();
  
  return newSelect()
      .add("where FACULDADE.ID = ?").param(faculdadeKey.getId())
      .add("and ALUNO.ID = ?").param(key.getId())
      .single();
}

Na implementação acima, a cláusula where diz que retornará um aluno do respectivo ID que foi recebido como parâmetro pelo método porId().

public List<Disciplina> porAlunoKey(AlunoKey key) {
  FaculdadeKey faculdadeKey = key.getFaculdadeKey();

  return newSelect()

      .add("where FACULDADE.ID = ?").param(faculdadeKey.getId())
      .add("and DISCIPLINA.ALUNO_ID = ?").param(key.getId())

      .list();
}

No método porAlunoKey() deverá retornar uma lista de disciplinas de um determinado aluno. Note que no dois exemplos é explicitado que deverá retornar exatamente um aluno dado um ID e disciplinas por aluno, não existe outra possibilidade.

Só que agora sugiu a necessidade de buscar alunos por nome e pensando na usabilidade da aplicação não seria útil para o usuário digitar exatamente o nome completo de aluno para chegar até um determinado aluno.

Nessa abordagem teríamos a seguinte implementação:

public List<Disciplina> porAluno(String nomeAluno) {
  return newSelect()

      .add("where ALUNO.NOME = ?").param(nomeAluno)

      .list();
}

A implementação acima funcionaria caso o nome fornecido seja igual o que está cadastrado, então caso tivessemos dois registros com o nome João da Silva, ambos seriam recuperados.

Em situações que o usuário precise digitar somente o primeiro nome, a consulta retornará zero registros, pois o operador igual(=) define que o valor tem que ser exato ao que está gravado na coluna de uma determinada tabela.

Então uma solução possível seria o usuário digitar uma parte do nome do aluno e trazer os alunos que o nome contenha o que foi digitado na busca.Quando o usuário digitar o nome Pedro, a busca retornaria filtrada com todos os alunos que contenham a palavra Pedro no nome. Para essa solução usuariamos a cláusula like no lugar de where, além disso, o método retornará um PageList<T> que será falado no artigo da implementação do filtro.

O teste

O teste que testa um filtro é muito similar ao teste de buscador. Os blocos lógicos continuam os mesmos, mas a diferença está na resposta, em vez de retornar um List ou um único objeto de uma determinada entidade, retorná um objeto do tipo PageList, além de passarmos também um RequestWrapper.

Para melhor entendimento, vamos analisar o seguinte teste:

public void page_por_aluno_key() {
  Aluno aluno = AlunosFalso.ALUNO_1;
  AlunoKey alunoKey = new AlunoKey(aluno);

  List<Disciplina> contra = ImmutableList.of(DISCIPLINA_1_ALUNO_1, DISCIPLINA_2_ALUNO_1);
  List<String> prova = Lists.transform(contra, new DisciplinaToString());

  FakeRequestWrapper wrapper = new FakeRequestWrapper();
  wrapper.put("nome", "João");

  PageList<Disciplina> page = buscarDisciplina.pagerPorAlunoKeyKey(alunoKey, wrapper);
  List<Disciplina> list = page.getRows();
  List<String> res = transform(list, new DisciplinaToString());

  assertThat(res.size(), equalTo(2));
  assertThat(res, equalTo(prova));
}

A primeira parte do teste é análogo a prova que já fazemos em testes de buscadores.

Logo em seguida usamos uma implementação de um RequestWrapper para simularmos a inserção de um parâmetro na requisição. O valor do parâmetro inserido deve ser referente aos nomes dos alunos falsos que usamos para montar a prova.

O próximo passo é criar o método pagerPorAlunoKey() em BuscarDisciplina que retornarará um PageList<Disciplina>, no momento que esse método for criado utilizando o atalho Ctrl + 1, o Eclipse criará o método, mas definirá um FakeRequestWrapper como parâmetro, então certifique-se que a assinatura do método estará da seguinte forma:

public PageList<Disciplina> pagerPorAlunoKeyKey(AlunoKey alunoKey, RequestWrapper wrapper);

Como foi mencionado, o método pagerPorAlunoKey() vai retornar um PageList e para validarmos o conteúdo do mesmo, utilizamos o método getRows() que devolve um List. Obtendo um List, fazemos o procedimento de transformar seu conteúdo num List de String para validar seu conteúdo.

As assertivas são as mesmas dos testes de buscadores.

Com o teste montado, podemos partir para a implementação do método pagerPorAlunoKeyKey().

Códigos-fonte

TesteDeBuscarDisciplina.java


 
 

objectos, Fábrica de Software LTDA

  • R. Demóstenes, 627. cj 123
  • 04614-013 - Campo Belo
  • São Paulo - SP - Brasil
  • +55 11 5093-8640
  • +55 11 2359-8699
  • contato@objectos.com.br