Mostrando postagens com marcador OO. Mostrar todas as postagens
Mostrando postagens com marcador OO. Mostrar todas as postagens

segunda-feira, 5 de junho de 2017

Métodos visíveis apenas para classes de test no Apex - Salesforce

Uma coisa que pode ser muito complicada na execução de um trabalho que envolve codificação Apex no ambiente Salesforce é a necessidade de cobertura de teste (de pelo menos 75% do código). Dependendo do nível de complexidade da classe que se deseja testar, o trabalho de se gerar as condições para cobrir o todo o código, pode ser bem mais desgastante. É quase um consenso entre eu e meus amigos desenvolvedores Salesforce, que é rápido construir a classe, do que sua cobertura de teste! ;) Talvez esteja sendo dramático... mas é quase isso. 

Pensando nesse cenário, suponhamos que tenhamos que testar a classe abaixo (supondo que ela fosse uma classe com uma complexa lógica):


public class LogicaComplexa {
    
    public LogicaComplexa(){}
    
    public void metodoComplexo(){
        //lógica muito complexa e no meio dela você chama um método privado
        this.metodoPrivado();
    }
    
    private void metodoPrivado(){
        //código que precisa ser coberto
    }
}


Veja que no exemplo acima, temos um método privado e um público. Suponhamos que precise testar o método privado, sem ter que passar por toda lógica do método público, que possui uma lógica complexa. O que podemos fazer? Colocar o método público? Nada disso... Para ajudar nesse árduo trabalho que é cobrir 100% de todo o código, temos uma anotação para método Apex, que permite acessarmos um método (para realizar a cobertura de teste) mesmo ele sendo privado (private method). Essa anotação é o @TestVisible. Com ele, mesmo o método sendo privado, é possível acessá-lo por uma classe de teste Apex. Veja com fica esse método:


@TestVisible private void metodoPrivado(){
    //código que precisa ser coberto
}

Com essa annotation @TestVisible, é possível acessar um método privado em uma classe de teste: 


@isTest
private class LogicaComplexaTest {
    @isTest static void teste() {
        LogicaComplexa logica = new LogicaComplexa();
        logica.metodoPrivado();
    }
}


Bem, essa é a dica rápida de hoje.



* Está precisando de um suporte ou uma consultoria nos desenvolvimentos de classes teste Apex dentro da sua plataforma Salesforce? Entre em contato conosco - CbCloud: http://www.cbcloud.com.br/


sábado, 8 de abril de 2017

Trabalhando com SObject no Apex - Salesforce

Um das coisas mais interessantes de se trabalhar com linguagens de programação Orientadas a Objeto é a possibilidade de se trabalhar com Abstração. No Salesforce, mais especificamente no plataforma Force.com, todos os objetos abstraem de sObject, sendo assim possível, trabalhar de forma genérica com todos os Objetos da Plataforma, sejam eles nativos ou personalizados.

Vamos ao primeiro exemplo de como isso funciona:


    
SObject sObj1 = new Account();
SObject sObj2 = new MeuObjeto__c();


Veja que instanciei um objeto Account e (personalizado) MeuObjeto__c como um sObject sem problemas. Assumindo esse conceito de abstração, consigo, por exemplo atualizar atualizar registros de um Objeto Account ou Personalizado com o mesmo código:


  
    public void Main() {
        Account conta = [SELECT id, name, OwnerId FROM Account LIMIT 1];
        MeuObjeto__c meuObj = [SELECT id, name, OwnerId FROM MeuObjeto__c LIMIT 1];
        
        this.atualizaProprietario(conta, UserInfo.getUserId());
        this.atualizaProprietario(meuObj, UserInfo.getUserId());
    }
    
    public void atualizaProprietario(SObject sObj, id idNovoProprietario){
        sObj.put('OwnerId', idNovoProprietario);
        update sObj;
    }

No método Main, eu busco os dados de objetos diferente (Account e MeuObjeto__c) e chamo um método genérico, chamado atualizaProprietário que tem o poder de atualizar qualquer objeto da plataforma Force.com, afinal todos abstraem de sObject (por isso uso o sObject como parâmetro desse método). No método atualizaProprietário, veja que uso o método put do SObject (que é um Key/Value) para dizer qual campo desejo atualizar (OwnerId) e qual o novo valor (passado por parâmetro).

Bem, vamos ver agora como faço para buscar, de forma genérica, dados de um sObject:


 
    public void Main() {
        Account conta = [SELECT id, name, OwnerId FROM Account LIMIT 1];
        MeuObjeto__c meuObj = [SELECT id, name, OwnerId FROM MeuObjeto__c LIMIT 1];
        
        String nomeConta = this.buscaNome(conta);
        String nomeMeuObj = this.buscaNome(meuObj);
        
        System.debug('Nome da conta: ' + nomeConta);
        System.debug('Nome do meuObj: ' + nomeMeuObj);
    }
    
    public String buscaNome(SObject sObj){
        Object nome = sObj.get('name');
        return String.valueOf(nome);
    }


Observe que, criei um método buscaNome, que utiliza o método get do sObject para buscar o valor de um campo no objeto. O resultado dos System.Debug são:





Por fim, vamos fazer um método que retorne uma String com o tipo do Objeto que foi passado como parâmetro:


 
    public void Main() {
        Account conta = [SELECT id, name, OwnerId FROM Account LIMIT 1];
        MeuObjeto__c meuObj = [SELECT id, name, OwnerId FROM MeuObjeto__c LIMIT 1];
        
        String tipoConta = this.buscaTipo(conta);
        String tipoMeuObj = this.buscaTipo(meuObj);
        
        System.debug('Tipo da conta: ' + tipoConta);
        System.debug('Tipo do meuObj: ' + tipoMeuObj);
    }
    
    public String buscaTipo(SObject sObj){
        Schema.DescribeSObjectResult result = sObj.getSObjectType().getDescribe();
        return result.getName();
    }

Para buscarmos o tipo do Objeto, usamos o método getSObjectType, que retorna um SObjectType e neste usamos o método getDescribe. O describe nos retorna informações informações básicas através do DescribeSObjectResult. No result temos um método getName que nos trás o tipo do Objeto, no caso Account e MeuObjeto__c:





Bem, por hoje é somente isso! :)





* Está precisando de um suporte ou uma consultoria nos desenvolvimentos Apex dentro da sua plataforma Salesforce? Entre em contato conosco - CbCloud: http://www.cbcloud.com.br/