Em que TDD ajuda no design da sua aplicação? Simples, ele o mantém limpo a medida que descobre novas funcionalidades.
Suponhamos que estamos usando o estilo de fora para dentro na construção de nossos testes, devemos então começar pela interface do usuário, portanto teríamos o seguinte teste:
public class CadastroClienteTest {
@Test public void deveriaEmitirMensagemDeAvisoParaClienteEmAtrazoAoSelecionarCliente(){}
}
Esse teste serve de ponto de partida para o seu design lembre-se que aqui você ainda não pensou em acesso ao banco e em nada de services etc..., apenas disse uma funcionalidade que a sua interface deveria ter, ao ir implementando os métodos e usando uma classe para mockar as suas dependências, você vai desenhando o seu código, implementando apenas aquilo que deve ser implementado.
Teriamos o seguinte teste:
public class CadastroClienteTest {
private CadastroClienteManageBean telaCadastro;
private FacesMessages facesMessages;
@Before public void configuraDependencias(){
facesMessages = Mockito.mock(FacesMessages.class);
telaCadastro = new CadastroClienteManageBean();
telaCadastro.setFacesMessages(facesMessages);
}
@Test public void deveriaEmitirMensagemDeAvisoParaClienteEmAtrazoAoSelecionarCliente(){
telaCadastro.selecionarCliente(1);
Mockito.verify(facesMessages).add(FacesMessage.SEVERITY_ERROR,"cliente em atrazo");
}
}
e sua respectiva classe:public class CadastroClienteManageBean {
private FacesMessages facesMessages;
public void selecionarCliente(Integer id){
// deveria ir ao banco
facesMessages.add(FacesMessage.SEVERITY_ERROR,"cliente em atrazo");
}
public void setFacesMessages(FacesMessages facesMessages){
this.facesMessages = facesMessages;
}
}
Agora reparando neste código perceba que o sistema não está indo até o banco, para de fato trazer o resultado, ai entra algo que acho incrível do TDD, ele te ajuda a ter um design limpo.
vamos agora melhorar o teste, para fins de simplificação não iremos criar um service para o acesso ao banco, vamos conectar diretamente:
public class CadastroClienteTest {
private CadastroClienteManageBean telaCadastro;
private FacesMessages facesMessages;
@Before public void configuraDependencias(){
facesMessages = Mockito.mock(FacesMessages.class);
registrosDeClientes = Mockito.mock(RegistrosDeClientes.class);
telaCadastro = new CadastroClienteManageBean();
telaCadastro.setFacesMessages(facesMessages);
}
@Test public void deveriaEmitirMensagemDeAvisoParaClienteEmAtrazoAoSelecionarCliente(){
Cliente clienteEmAtrazo = new Cliente();
clienteEmAtrazo.setEmAtrazo(true);
Mockito.when(registrosDeClientes.buscarCliente(1)).thenReturn(clienteEmAtrazo);
telaCadastro.selecionarCliente(1);
Mockito.verify(registrosDeClientes).buscarCliente(1);
Mockito.verify(facesMessages).add(FacesMessage.SEVERITY_ERROR,"cliente em atrazo");
}
}
public interface RegistrosDeClientes {
public Cliente buscarCliente(Integer id);
}
Repare que o seu teste agora está sugerindo que você tenha um método de busca, uma vez que você tenha terminado o seu teste na tela, uma abordagem seria descer o nível e pegar todas as classes que você mockou no teste da interface e agora ir implementando o teste para as camadas mais baixas.
TDD ajuda a melhorar o design, fazendo você programar aquilo que você precisa implementar, ao invés de ficar criando métodos para classes que você acha que irá precisar.
O método usado aqui baseasse no teste de fora para dentro, onde fomos construindo um teste para a interface e mockando os objetos das camadas abaixo, e posteriormente deveríamos implementar os testes das camadas mais baixas, com os dados que coletamos dos mocks da camada superior.
Em resumo o mock te sugere o que pode ser necessário que você tenha que implementar, caso não tenha usado ainda TDD, faça um teste e se esforce, pois realmente vale a pena.
Nenhum comentário :
Postar um comentário