Domanda

Sono la scrittura di codice fatto su Salesforce e al fine di liberare i test di unità devono coprire almeno il 75% .

Quello che sto affrontando è che il classOne che chiama i metodi da classTwo hanno anche a test di unità copertina di classTwo all'interno ClassOne , anche se si è fatto in file di classTwo già.

File MyClassTwo

 public with sharing class ClassTwo {

    public String method1() {
        return 'one';
    }

    public String method2() {
        return 'two';
    }

    public static testMethod void testMethod1() {

        ClassTwo two = new ClassTwo();
        String out = two.method1();
        system.assertEquals(out, 'one'); //valid    
    }

    public static testMethod void testMethod2() {
        ClassTwo two = new ClassTwo();
        String out = two.method2();
        system.assertEquals(out, 'two'); // valid
    }

}

MyClassOne File

 public with sharing class ClassOne {

    public String callClassTwo() {
        ClassTwo foo = new ClassTwo();
        String something = foo.method1();

        return something;
    }

    public static testMethod void testCallClassTwo() {
        ClassOne one = new ClassOne();
        String out = one.callClassTwo();

        system.assertEquals(out, 'one');
    }
}

Il risultato della prova MyClassOne non sarebbe tornato copertura di test 100% perché dice non ho coperto MyClassTwo method2 () parte interna del file di MyClassOne.

Ma ho già scritto unit test per MyClassTwo all'interno di file di MyClassTwo come si può vedere.

Quindi questo significa che devo copiare e incollare il test di unità nel file di MyClassTwo verso MyClassOne?

In questo modo mi dà una copertura del 100%, ma questo sembra davvero fastidioso e ridicolo. Avendo stessa prova in ClassA e ClassB ....? Faccio di sbagliato o è questo il modo?

Dopo aver detto, è possibile creare l'oggetto finto in Salesforce? non ho dato come ancora ..

http://sites.force.com/answers/ideaView?c=09a30000000D9xt&id=087300000007m3fAAA&returnUrl=/apex/ideaList%3Fc%3D09a30000000D9xt%26category%3DApex%2B%2526%2BVisualforce% 26p% 3D19% 26sort% 3Dpopular

UDPATE

ho ri-scritto il codice e aggiornato in precedenza, questa volta di sicuro prova ClassOne non sarebbe tornato al 100% anche se non sta chiamando classTwo method2 ()

È stato utile?

Soluzione

Commenti su librerie finte Java non sono molto utili in Salesforce mondo;) Ai miei progetti di solito mirati per rendere i nostri dati di test nel metodo di prova, chiamando la funzionalità reale, controllando i risultati ... e l'intero framework di test su lato Salesforce è responsabile per il rollback delle transazioni (quindi non dati di test viene salvato DB, alla fine, indipendentemente dal fatto che il test è fallito o superato).

In ogni caso ...

Masato, le vostre classi non compilare (metodi di classe fuori portata, public String hello() senza alcun String restituito) ... Dopo ho riparato ho semplicemente destro cliccato i MyClassA -> -> Force.com eseguire test ed ha ottenuto la copertura del codice completo senza problemi in modo che il problema deve trovarsi da qualche altra parte ...

Ecco come appare: http://dl.dropbox.com/u /709568/stackoverflow/masato_code_coverage.png

Sto cercando di pensare a quello che potrebbe avere sbagliato andato ... sei sicuro che tutte le classi compilare e sono stati salvati sul lato server? Hai messo metodi di prova in medesime classi come funzionalità o in quelli separati (in genere faccio nome della classe separata con nome simile come MyClassATest). Se si tratta di una classe separata - su cui il file ha fatto si fa clic su "test run"? Ultimo ma non meno importante - se siete di fronte questo problema durante la distribuzione da sandbox alla produzione, assicurarsi di aver selezionato tutte le classi che vi interessano nella distribuzione guidata?

Altri suggerimenti

Se si vuole veramente "unità" di prova, è necessario verificare il comportamento della classe B ed il comportamento della classe A, beffardo la chiamata al metodo della classe B.

Questa è una conversazione dura tra amanti finti e altri (Martin Fowler credo non è un "beffardo").

In ogni caso. Si dovrebbe smettere di pensare a una copertura del 100%. Si dovrebbe pensare a:

  • Perché sto testando?

  • Come sto testando?

Ecco, mi piacerebbe sicuramente andare per 2 test:

  • Un test per la classe B nel file di prova b classe per essere sicuri che il metodo B è ben implementato, con tutti gli effetti collaterali, i valori laterali, ecc.

  • un test per la classe A beffardo la classe B

Che cosa è un finto?

Per rimanere molto semplice: un finto è una porzione di codice nel tuo test che sta andando dire: quando il metodo di classe B viene chiamato, restituisce sempre questo valore:. "+++"

In questo modo, si consente a dover una suite di test maintanable e modulabile.

In Java, I Love Mockito: http://mockito.org/

Anche se uno dei miei colleghi è maintainer di piombo per EasyMock: http://easymock.org/

Spero che questo aiuti. Chiedimi se avete bisogno di ulteriore aiuto.

EDIT ALCUNI ESEMPI

Con Java e Mockito:

public class aUTest {

    protected A a;

    @Mock protected B b;

    @Before
    public void setUp(){
        MockitoAnnotations.initMocks(this);
        a = new A();
        ReflectionTestUtils.setField(a, "b", b);
    }

        @Test
    public void test_A_method_should_not_throw_exception()
            when(b. execute()).thenReturn(true); //just an example of a return value from b. execute()
            Boolean result = a.testHello();

        // Assert
        Assert.assertEquals(true, result);
    }

Ho creato una classe Apex chiamato TestHelper per tutti i miei oggetti mock. Io uso costanti (finali statici) per i valori che potrei avere bisogno di altrove e campi statici pubblici per gli oggetti. Funziona alla grande e dal momento che non vengono utilizzati metodi, non è necessaria alcuna copertura di test.

public without sharing class TestHelper {
public static final string testPRODUCTNAME = 'test Product Name';
public static final string testCOMPANYID = '2508'; 

public static Account testAccount {
    get{
        Account tAccount = new Account(
            Name = 'Test Account',
            BillingStreet = '123 Main St',
            BillingCity = 'Dallas',
            BillingState = 'TX',
            BillingPostalCode = '75234',
            Website = 'http://www.google.com',
            Phone = '222 345 4567',                
            Subscription_Start_Date__c = system.today(),
            Subscription_End_Date__c = system.today().addDays(30),
            Number_Of_Seats__c = 1,
            companyId__c = testCOMPANYID,
            ZProduct_Name__c = testPRODUCTNAME);      
        insert tAccount;
        return tAccount; 
    }
}

}

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top