Como o titulo ja diz, estou com uma pequena duvida, procurei muito mas não encontrei nada que resolvesse meu problema.
Estou criando testes para uma classe (programando seguindo o TDD), e gostaria de criar testes para os metodos Set, porem não gostaria de repetir basicamente a mesma estrutura, para testar cada um dos set, então séria possivel se ter uma estrutura assim:
public void testeSetNome(metodo setTestado, String novoNome){
setTestado(novoNome)
}
aonde o valor de setTestado seria: usuario.setNome()
public class HelloWorld {
private String a;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public static void main(String[] args) {
HelloWorld hw = new HelloWorld();
hw.setA(hw.getA());
}
}
Se for isso sim, se o metodo que você quer passar retorna algo (exemplo String) você pode passar ele como parametro (se o metodo que vai receber pedir uma String (exemplo)).
nescessario eu n acho muito não, mas isso é para uma atividade da universidade, e os professores exigem que tenha teste pra tudo, temos que desenvolver totalmente usando a metodologia TDD, eu ainda estou aprendendo os conceitos de TDD, então alguem poderia me dizer se realmente é nescessario testar os metodos set da classe?
Te aconselharia a aplicar os teste apenas a métodos de negócio e DAOs.
Passar um método como parâmetro, na verdade vc estaria passando o retorno deste método, logo se for um void, não há como; exceto se for usar reflection como o colego citou.
se vc tem:
public void setValor(String valor) {
this.valor = valor;
}
Como vc testaria??
ClasseA obj = new ClasseA();
obj.setValor("123");
assertEquals("123", obj.getValor());
isso??
fabiomedeirosf, o problema de testar dessa forma é que estaria fazendo uma estrutura muito semelhante diversas vezes, o que seria basicamente ferir outro principio de não repetir codigo, para facilitar nas futuras refatorações.
perguntei aos professores se é permitido o uso de reflection que o AbelBueno citou.
mas, agora vêm a duvida se é nescessario testar os metodos set?
desculpa a pergunta é que estou tão traumatizado em fazer teste para tudo que quando não teste sequer uma linha da minha classe fico preocupado =D
Geralmente em métodos sets são apenas para atribuição de valores; evidente que, pode-se colocar lógica lá, mas não é recomendável por questões de boas práticas.
Como no exemplo que citei, acho desnecessário a aplicação de testes, logo, se realmente necessário acho muito preciosismo.
Bom, como se trata de um exemplo (não tão) didático, dá pra deixar passar. De fato, ficar copiando e colando a mesma estrutura é realmente incoveniente, e usar uma estrutura de repetição é interessante.
Como os colegas já falaram, para fazer isso você precisará usar a API de Reflection’s do Java. A partir de um objeto .class você pode obter uma lista de métodos da sua classe. Como se trata de métodos get/set você pode passar uma lista de propriedades de forma que você possa inferir o nome do métod set e do método e o valor que será setado, daí você invoca o método set sobre o objeto em teste e faz o assert usando o método get.
Mas reiterando, é um exagero aplicar testes unitários para tudo, especialmente métodos get/set. TDD é legal para montar classes que envolvam regras de negócio ou lógica, por exemplo, uma API de data/hora ou manipulação de String’s.
rmendes, muito obrigado pela resposta, realmente eu acho meio exagerado se testar dessa forma, mas na universidade acho mais para criar o habito, eles exigem que todo programa que fazemos, deve ser implementado usando o TDD, ou seja basicamente tenho que criar teste para tudo, antes mesmo de implementar a classe.