Question

J'ai écrit le code fait accompli sur Salesforce et afin de libérer les tests unitaires doivent couvrir au moins 75% .

Ce que je suis face est que la classOne que les méthodes d'appels de classTwo doivent également couvrir le test unitaire de classTwo dans les classOne , même si elle se fait dans le fichier classTwo déjà.

Fichier 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 de fichier

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

Le résultat des tests MyClassOne ne retournerait pas la couverture de test 100% parce qu'il dit que je ne l'ai pas couvert MyClassTwo method2 () partie à l'intérieur du fichier MyClassOne.

Mais je l'ai déjà écrit test unitaire pour MyClassTwo à l'intérieur du fichier MyClassTwo que vous pouvez voir.

Alors que cela signifie que je dois copier et coller le test unitaire dans le fichier MyClassTwo vers MyClassOne?

Cela me donne une couverture de 100%, mais cela semble vraiment ennuyeux et ridicule. Ayant même test dans ClassA et ClassB ....? Suis-je fais mal ou est-ce le chemin?

Ceci étant dit, est-il possible de créer un objet simulé dans Salesforce? Je n'ai pas figure encore comment ..

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

Je récrit le code et mis à jour ci-dessus, cette fois pour le test que de classOne ne reviendraient pas à 100%, même si elle ne demande pas classTwo method2 ()

Était-ce utile?

La solution

Commentaires à propos des bibliothèques Java simulacres ne sont pas très utiles dans le monde Salesforce;) A mes projets nous visent généralement à faire nos propres données de test dans la méthode d'essai, appelant la fonctionnalité réelle, la vérification des résultats ... et d'un cadre de test tout sur côté Salesforce est responsable de rollback transaction (donc pas de données de test est enregistré DB à la fin indépendamment du fait que le test a échoué ou passé).

En tout cas ...

Masato, vos classes ne compile pas (méthodes de champ extérieur de la classe, public String hello() sans chaîne retourné) ... Après je l'ai fixé je simplement droit CLIQUÉ MyClassA -> Force.com -> exécuter des tests et a obtenu une couverture complète du code sans aucun problème pour que votre question doit se situer quelque part ailleurs ...

Voici à quoi il ressemble: http://dl.dropbox.com/u /709568/stackoverflow/masato_code_coverage.png

Je suis en train de penser à ce qui aurait pu aller mal ... Etes-vous sûr toutes les classes et compilent ont été enregistrées sur le côté serveur? Avez-vous mis les méthodes d'essai dans la même classe que la fonctionnalité ou dans les différents (en général je fais nom de classe distincte avec un nom semblable comme MyClassATest). S'il est une catégorie distincte - sur quel fichier avez-vous cliqué sur « exécuter des tests »? Last but not least - si vous êtes confronté à ce problème lors du déploiement de bac à sable à la production, assurez-vous que vous avez sélectionné toutes les classes dont vous avez besoin dans l'assistant de déploiement?

Autres conseils

Si vous voulez vraiment tester « unité », vous devez tester le comportement de votre classe B et le comportement de votre classe A, se moquant de l'appel à la méthode de la classe B.

C'est une conversation difficile entre les amateurs et autres simulacres (Martin Fowler, je pense n'est pas un « moqueur »).

Quoi qu'il en soit. Vous devriez cesser de penser à une couverture de 100%. Vous devriez penser à:

  • Pourquoi suis-je tester?

  • Comment suis-je tester?

Ici, je serais certainement aller pour 2 tests:

  • Un test pour la classe B dans le fichier de test de classe b pour vérifier que la méthode B est bien mis en œuvre, avec tous les effets secondaires, les valeurs secondaires, etc.

  • un test pour la classe A se moquant de la classe B

Qu'est-ce qu'une maquette?

Pour rester très simple: Une maquette est une partie de code dans votre test qui va dire: quand la méthode de classe B est appelé, retourne toujours cette valeur. « +++ »

En faisant cela, vous laissez-vous avoir une suite de tests maintanable et modulable.

En java, je aime Mockito: http://mockito.org/

Bien que l'un de mes collègues est mainteneur principal de easymock: http://easymock.org/

Hope this helps. Demandez-moi si vous avez besoin d'aide.

modifier certaines Exemple

Avec Java et 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);
    }

Je créé une classe Apex appelé TestHelper pour tous mes objets fantaisie. J'utilise des constantes (de finale statique) pour les valeurs que je pourrais avoir besoin ailleurs et les champs statiques publics pour les objets. Fonctionne très bien et l'absence de méthodes sont utilisées, aucune couverture de test est nécessaire.

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

}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top