Frage

Ich habe getan, das Schreiben von Code auf Salesforce und um die Unit-Tests zur Abdeckung habe zur Freigabe mindestens 75% .

Was ich bin vor, dass die classOne, dass Anrufe Methoden von classTwo haben auch Abdeckung classTwo Einheit Test innerhalb ClassOne , obwohl es bereits in classTwo Datei ausgeführt wird.

Datei 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
    }

}

Datei MyClassOne

 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');
    }
}

Das Ergebnis MyClassOne die Prüfung würde die Testabdeckung nicht zurück zu 100%, weil es sagt, ich habe MyClassTwo method2 () Teil innerhalb der MyClassOne Datei nicht abgedeckt.

Aber ich schrieb bereits Unit-Test für MyClassTwo innerhalb von MyClassTwo Datei wie Sie sehen können.

So bedeutet das ich habe zu kopieren und den Unit-Test in MyClassTwo Datei über MyClassOne einfügen?

Dadurch gibt mir so 100% Deckung, aber dies scheint wirklich ärgerlich und lächerlich. Mit demselben Test in ClassA und ClassB ....? Bin ich falsch mache oder ist dies der richtige Weg?

Having said, ist es möglich, Mock-Objekt in Salesforce erstellen? Ich habe nicht Figur, wie noch ..

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

ich wieder schrieb den Code und oben aktualisiert, diesmal sicher ClassOne Test würde zu 100% nicht zurück, obwohl es nicht classTwo method2 ()

ruft
War es hilfreich?

Lösung

Kommentare über Java Mock-Bibliotheken sind nicht sehr hilfreich in Salesforce Welt;) Zu meinen Projekten in der Regel wir gezielt für eigene Testdaten in der Testmethode machen, echte Funktionalität aufrufen, die Ergebnisse überprüft ... und ganze Test-Framework auf Salesforce-Seite ist verantwortlich für die Transaktion Rollback (also keine Testdaten an der DB am Ende gespeichert werden unabhängig davon, ob der Test fehlgeschlagen ist oder bestanden).

Wie auch immer ...

Masato, Ihre Klassen kompilieren nicht (Methoden außerhalb Klassenbereich, public String hello() ohne String zurückgegeben) ... Nachdem ich es behoben ich einfach mit der rechten geklickt die MyClassA -> Force.com -> laufen Tests und bekam vollständige Code-Coverage ohne Probleme, so muss das Problem liegt woanders ...

Hier ist, wie es aussieht: http://dl.dropbox.com/u /709568/stackoverflow/masato_code_coverage.png

Ich versuche zu denken, was schiefgelaufen sein könnte ... sind Sie sicher, dass alle Klassen kompilieren und wurden auf Server-Seite gespeichert? Haben Sie harte Probe gestellt Methoden in gleichen Klassen wie Funktionalität oder in separat diejenigen (in der Regel mache ich separate Klassennamen mit ähnlichen Namen wie MyClassATest). Wenn es eine eigene Klasse -, auf der Datei haben Sie auf „Run Tests“? Last but not least - wenn Sie dieses Problem von Sandbox-Produktion während der Bereitstellung konfrontiert sind, stellen Sie sicher, dass Sie alle Klassen ausgewählt Sie im Implementierungsassistenten benötigen?

Andere Tipps

Wenn Sie wirklich „Einheit“ Test wollen, sollten Sie das Verhalten Ihrer Klasse B-Test und das Verhalten Ihrer Klasse A, den Aufruf der Klasse B Methode spöttisch.

Das ist ein schwieriges Gespräch zwischen Mock-Liebhabern und andere (Martin Fowler Ich denke, ist kein „Spötter“).

Wie auch immer. Sie sollten Denken über 100% Abdeckung stoppen. Sie sollten denken:

  • Warum teste ich?

  • Wie teste ich?

Hier, ich würde auf jeden Fall für 2 Tests gehen:

  • Ein Test für die B-Klasse in die B-Klasse-Testdatei, um sicherzustellen, die B-Methode ist gut umgesetzt, mit allen Nebenwirkungen, Nebenwerte etc.

  • ein Test für die A-Klasse verspotten die Klasse B

Was ist ein Modell?

Bleiben sehr einfach: Ein Mock ist ein Teil des Codes in Ihrem Test, würde sagen: wenn die B-Klasse-Methode aufgerufen wird, immer diesen Wert zurück. „+++“

Auf diese Weise können Sie sich selbst ein maintanable und modulierbare Testsuite mit.

In Java, ich liebe Mockito: http://mockito.org/

Auch wenn einer meiner Kollegen ist Lead Maintainer für EasyMock: http://easymock.org/

Hope, das hilft. Fragen Sie mich bitte, wenn Sie weitere Hilfe benötigen.

EDIT einige Beispiel

Mit Java und 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);
    }

Ich habe eine Apex-Klasse namens TestHelper für alle meine Mock-Objekte. Ich benutze Konstanten (static final) für Werte, ich könnte an anderer Stelle und öffentliche statische Felder für Objekte benötigen. Funktioniert prima und da keine Methoden verwendet werden, wird keine Testabdeckung erforderlich.

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; 
    }
}

}

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top