Como Unidade de testar métodos privados em Java e Kotlin

GOVIND DIXIT
GOVIND DIXIT

Siga

Jul 23, 2019 · 4 min de leitura

Sim, Esta é a grande questão. Como fazer o teste de unidade de métodos privados?

deve um desenvolvedor testar os métodos privados na sua base de dados? ou deixá-los na confiança dos métodos públicos é uma forma. Cada desenvolvedor tem sua própria opinião de que devemos realmente testá-los ou não. Então, em poucas palavras, a questão foi reduzida a: “Existe alguma boa abordagem que possamos tentar para este trabalho?”

assim, Aqui estão todas as opções possíveis disponíveis para um desenvolvedor para testar métodos privados de seus aplicativos baseados em Java / kotlin em 2019:

  1. não testar métodos privados 😜(Sem raízes, sem uvas azedas)
  2. Dar os métodos de acesso público 😒 (não, eu não vou fazer isso é contra as práticas de codificação. I am a good developer, I follow best practices)
  3. Use a nested test class 😒 (This is not good to mixed production code with test code. Eu preciso mencionar novamente que eu sou um bom programador e eu apenas seguir as melhores práticas)
  4. Usar Java Reflexão 😃(Sim, isso parece interessante, eu sou para ela)

Apesar da crença comum de que, na verdade, é possível o acesso a campos privados e métodos de outras classes através de Java Reflexão. Nem sequer é assim tão difícil. Isto pode ser muito útil durante o teste de unidade.

Nota: Isto só funciona ao executar o código como uma aplicação Java autónoma, como você faz com testes unitários e aplicações regulares. Se você tentar fazer isso dentro de um applet Java, você vai precisar mexer com o SecurityManager. Mas, uma vez que isso não é algo que você precisa fazer muitas vezes, é deixado de fora deste texto até agora.

Method Parameter Reflection support was added in Java 8. Simplificando, ele fornece suporte para obter os nomes dos parâmetros em tempo de execução.

Para acessar um campo particular, você precisará chamar o Class.getDeclaredField(String name) ou Class.getDeclaredFields() método. The methods Class.getField(String name) and Class.getFields() methods only return public fields, so they won’t work. Aqui está um exemplo simples de uma classe com um campo particular, e abaixo o código de acesso a esse campo através de Java Reflexão:

public class PrivateObject {private String privateString = null;public PrivateObject(String privateString) {
this.privateString = privateString;
}
}PrivateObject privateObject = new PrivateObject("The Private Value");Field privateStringField = PrivateObject.class.
getDeclaredField("privateString");privateStringField.setAccessible(true);String fieldValue = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue);

Este exemplo de código irá imprimir o texto ” "fieldValue = The Private Value” qual é o valor do campo private privateString de PrivateObject a instância criada no início do exemplo de código.

Notice the use of the method PrivateObject.class.getDeclaredField("privateString"). É este método chamado que retorna o campo privado. Este método só devolve campos declarados nessa classe em particular, não Campos declarados em quaisquer superclasses.

Note A linha a negrito também. Ao chamar Field.setAcessible(true) você desliga as verificações de Acesso para este particular Field instância, apenas para reflexão. Agora você pode acessá-lo mesmo que seja privado, protegido ou âmbito de pacote, mesmo que o chamador não faz parte desses âmbitos. Você ainda não pode acessar o campo usando o código normal. O compilador não o permite.

aceder a métodos privados

para aceder a um método privado terá de chamar o método Class.getDeclaredMethod(String name, Class parameterTypes) ou Class.getDeclaredMethods(). The methods Class.getMethod(String name, Class parameterTypes) and Class.getMethods() methods only return public methods, so they won’t work.

Aqui está um exemplo simples de uma classe com um método privado, e abaixo disso o código para acessar esse método através de reflexão Java:

public class PrivateObject {private String privateString = null;public PrivateObject(String privateString) {
this.privateString = privateString;
}private String getPrivateString(){
return this.privateString;
}
}PrivateObject privateObject = new PrivateObject("The Private Value");Method privateStringMethod = PrivateObject.class.
getDeclaredMethod("getPrivateString", null);privateStringMethod.setAccessible(true);String returnValue = (String)
privateStringMethod.invoke(privateObject, null);System.out.println("returnValue = " + returnValue);

Este exemplo de código irá imprimir o texto ” "returnValue = The Private Value”, que é o valor retornado pelo método getPrivateString() quando invocado em PrivateObject a instância criada no início do exemplo de código.

Notice the use of the method PrivateObject.class.getDeclaredMethod("privateString"). É este método chamado que retorna o método privado. Este método só devolve métodos declarados nessa classe em particular, não métodos declarados em qualquer superclasses.

Note A linha a negrito também. Ao chamar Method.setAcessible(true) você desliga as verificações de Acesso para este particular Method instância, apenas para reflexão. Agora você pode acessá-lo mesmo que seja privado, protegido ou âmbito de pacote, mesmo que o chamador não faz parte desses âmbitos. Você ainda não pode acessar o método usando o código normal. O compilador não o permite.vamos tentar este conhecimento para algum código de nível de produção.
aqui está a classe contendo alguns métodos privados que queremos testar.

Deixe uma resposta

O seu endereço de email não será publicado.