2

こんにちは私は、将来のメソッド(Webサービス呼び出し用)と具体的な静的メソッドがほとんどないクラスのカバレッジを取得しようとしています。しかし、futureメソッドを呼び出した後、他のメソッドを呼び出すことができません...futureメソッドとWebサービスの呼び出しをカバーする方法を教えてください。

私のクラス構造:

public with sharing class AccountSynchController { 
 @future (callout=true)
    public static void importAccount(Set<Id> ids) {

    }
 @future (callout=true)
    public static void importContact(Set<Id> ids) {

    }
}

[future methods are called from trigger]

Test Class Code : 


        VAT__c testVat = new VAT__c();
    testVat.Code__c = '3';
    insert testVat;        

        Account testAccount = new Account();
        testAccount.Name = 'Test Account';
        testAccount.VATSales__c = testVat.Id;
        testAccount.VATPurchase__c = testVat.Id;
        testAccount.KvK_Nummer__c = '12312312';
        testAccount.PhoneExt__c = '12312312';
        testAccount.Website = '12312312';
        testAccount.BillingPostalCode = '12312312';
        testAccount.BillingCity = '12312312';
        testAccount.Fax = '12312312';
        testAccount.Phone = '12312312';
        testAccount.BillingStreet = '12312312';
        testAccount.BTW_Nummer__c = '12312312';
        testAccount.BillingCountry = '12312312';
        testAccount.BillingState = '12312312';
        testAccount.BTW_Nummer__c = '12312312'; 
        testAccount.E_mail__c = 'test@gmail.com';
        testAccount.Taal__c = 'NL';
        testAccount.SalesPaymentConditionCode__c = '15';
        testAccount.Code__c = '102';
        testAccount.fromExact__c = false;
        testAccount.Exact_Id__c = '123123';
        insert testAccount;

        Contact testContact = new Contact();
        testContact.AccountId = testAccount.Id;
        testContact.Birthdate = system.today();
        testContact.Conact_Exact_Number__c = '12312312312';
        testContact.Email = 'test@gmail.com';
        testContact.FirstName = 'first';
        testContact.Title_Code__c = 'Mr.';
        testContact.Geslacht__c = 'M';
        testContact.Initials__c = 'I';
        testContact.Language_Code__c = 'NL';
        testContact.LastName = 'last';
        testContact.MiddleName__c = 'middle';
        testContact.Phone = '12321312312';
        testContact.fromExact__c = false;
        insert testContact;

ありがとう..

4

3 に答える 3

5

Test.startTest()を呼び出して単体テストを開始してから、テストインサートを実行します。Test.stopTest()を呼び出して終了します。その最後のメソッドを呼び出すと、@futureメソッドが確実に実行されます。その後、アサーションを実行してトリガーのアクションを検証できます。

于 2012-07-03T15:48:34.763 に答える
2

Adam の回答を拡張してコールアウトをテストするには、Test.isRunningTest()メソッドを使用して、Web サービスからデータを返すことをエミュレートする機会を与える必要があります。これは最善ではありませんが、一般的に受け入れられている方法です。

もう 1 つのオプションは、いくつかのモックとインジェクションを使用することですが、これは本来あるべきほど単純ではないため、ほとんどの人は最初のオプションを選択します。

于 2012-07-03T16:11:48.030 に答える
0

テスト クラスから直接 Web サービスの呼び出しを行うことは不可能であるため、中毒のモック クラスを作成する必要があります。その目的は、偽の応答を生成することです。

// This causes a fake response to be generated
    Test.setMock(WebServiceMock.class, new WebServiceMockImpl());

ここで、WebServiceMock.class は上記のクラスです。その後、テスト クラスで真の Web サービス コールアウト メソッドを呼び出すことができます。

詳細については、次のリンクを確認してください。

http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_callouts_wsdl2apex_testing.htm

于 2013-10-24T03:22:04.037 に答える