3

私はセールスフォースでコードを書きましたが、単体テストをリリースするには、少なくとも75%をカバーする必要があります。

私が直面しているのは、既にファイルで行われているにもかかわらず、classOneからメソッドを呼び出す がclassOne 内の の単体テストclassTwoをカバーする必要があることです。classTwoclassTwo

ファイル 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

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

MyClassOne ファイル内の MyClassTwo method2() 部分をカバーしていないため、MyClassOne のテスト結果は 100% のテスト カバレッジを返しません。

しかし、ご覧のとおり、 MyClassTwo ファイル内に MyClassTwo の単体テストを既に記述しています。

これは、MyClassTwo ファイルの単体テストをコピーして MyClassOne に貼り付ける必要があるということですか?

そうすることで 100% のカバレッジが得られますが、これは本当に面倒でばかげているように思えます。ClassA と ClassB で同じテストを行う....? 私は間違っていますか、それともこの方法ですか?

はいえ、セールスフォースでモックオブジェクトを作成することは可能ですか? 私はまだ方法を理解していません..

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

コードを書き直して上記を更新しました。今回は、classTwo method2() を呼び出していなくても、classOne テストが 100% を返さないことを確認しました。

4

3 に答える 3

3

Java モック ライブラリに関するコメントは、Salesforce の世界ではあまり役に立ちません ;) 私のプロジェクトでは通常、テスト メソッドで独自のテスト データを作成し、実際の機能を呼び出し、結果を確認することを目指しました...そして、Salesforce 側のテスト フレームワーク全体はトランザクションのロールバックを担当します (したがって、テストが失敗したか成功したかに関係なく、最終的にテスト データは DB に保存されません)。

ともかく...

マサト、あなたのクラスはコンパイルされません (クラス スコープ外のメソッドでpublic String hello()、文字列が返されません)...修正した後、MyClassA -> Force.com -> テストを実行し、問題なく完全なコード カバレッジを取得しました。あなたの問題はどこかにあるはずです...

これがどのように見えるかです:http://dl.dropbox.com/u/709568/stackoverflow/masato_code_coverage.png

何がうまくいかなかったのか考えようとしています...すべてのクラスがコンパイルされ、サーバー側に保存されましたか? テストメソッドを機能と同じクラスに配置しましたか、それとも別のクラスに配置しましたか (通常、私は のような似た名前の別のクラス名を作成しますMyClassATest)。別のクラスの場合 - どのファイルで「テストの実行」をクリックしましたか? 最後になりましたが、サンドボックスから本番環境への展開中にこの問題に直面している場合は、展開ウィザードで必要なすべてのクラスを選択したことを確認してください。

于 2010-12-07T21:47:03.107 に答える
1

すべてのモックオブジェクトに対して TestHelper という Apex クラスを作成しました。他の場所で必要になる可能性のある値には定数 (static final) を使用し、オブジェクトには public static フィールドを使用します。うまく機能し、メソッドが使用されていないため、テスト カバレッジは必要ありません。

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

}

于 2011-04-13T16:25:17.197 に答える
1

本当に「単体」テストが必要な場合は、クラス B メソッドの呼び出しをモックして、クラス B の動作とクラス A の動作をテストする必要があります。

これは、モック愛好家と他の人の間で難しい会話です (Martin Fowler は「モック」ではないと思います)。

ともかく。100% のカバレッジについて考えるのはやめるべきです。次のことを考慮する必要があります。

  • なぜ私はテストしているのですか?

  • どのようにテストしていますか?

ここで、私は間違いなく2つのテストに行きます:

  • B クラスを b クラス テスト ファイルに 1 回テストして、B メソッドが適切に実装されていることを確認し、すべての副作用、副作用などを確認します。

  • クラス B をモックする A クラスの 1 つのテスト

モックとは?

非常に簡単に言うと、モックはテスト内のコードの一部であり、Bクラスメソッドが呼び出されると、常にこの値を返します: "+++" .

これにより、保守可能でモジュール化可能なテスト スイートを使用できます。

Java では、mockito が大好きです: http://mockito.org/

私の同僚の 1 人が easymock の主任メンテナーですが、http: //easymock.org/

お役に立てれば。さらに助けが必要な場合は、私に尋ねてください。

いくつかの例を編集

Javaと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);
    }
于 2010-12-07T00:11:44.193 に答える