Passar metódo como parametro de outro metodo, é possivel?

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()

Obrigado pessoal.

Teste em método set??

É isso aqui?

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)).

Com Java não.

Não é possível fazer da forma como quer.
Pode obter o mesmo efeito com reflection.

Você passaria o nome do método como String e através de reflection o executaria.

Talvez no Java 8 seja possível fazer algo assim, onde está previsto utilizar funções coo parâmetros.

Mas uma observação: você realmente acha necessário testar métodos Set ?

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?

Obrigado

se houver validações nele ou lógica de negócio (o que eu acho uma péssima prática), sim.

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??

eles não têm nada apenas, modificam valores na classe, um exemplo é esse:

public void setQuantidadeExemplaresDisponivel(int quantidadeExemplaresDisponivel) { this.quantidadeExemplaresDisponivel = quantidadeExemplaresDisponivel; }

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

obrigado

O que estou levantando o alarde é pra isto mesmo.

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.

[]s

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.

Mas muito obrigado pelas dicas.