Salesforceでユニットテストを機能させる方法は?
-
09-10-2019 - |
質問
私はSalesforceでコードを書いてきましたが、ユニットテストをリリースするためには、少なくともカバーする必要があります 75%.
私が直面しているのはそれです classOne
それはからの方法を呼び出します classTwo
また、カバーする必要があります classTwo
'の単位テスト Classone内 で行われていても classTwo
すでにファイル。
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 Methodswo File内のmyclasstwo methodwoの部分()をカバーしていないと書かれているため、100%のテストカバレッジを返しません。
しかし、私はあなたが見ることができるように、myclasstwoファイルの内部にmyclasstwoのユニットテストをすでに書きました。
これは、MyClasStwoファイルのユニットテストをMyClassoneにコピーして貼り付ける必要があることを意味しますか?
そうすることで、100%のカバレッジが得られますが、これは本当に迷惑でredicります。 ClassaとclassBで同じテストを受けています....?私は間違っているのですか、それともそうですか?
言った、 Salesforceでモックオブジェクトを作成することは可能ですか? 私はまだどのように理解していません。
udpate
コードを書き直して上記で更新しましたが、今回はClasstwo Methods2()を呼び出していなくても、ClassOneテストは100%戻りません。
解決
Java Mockライブラリに関するコメントは、Salesforceの世界ではあまり役に立ちません;)私のプロジェクトでは、通常、テスト方法で独自のテストデータを作成し、実際の機能を呼び出し、結果を確認することを目指していました...そしてSalesforce側のテストフレームワーク全体はです。トランザクションロールバックの責任(したがって、テストが失敗したか合格したかに関係なく、最終的にはテストデータがDBに保存されません)。
ともかく...
マサート、あなたのクラスはコンパイルしません(クラスの範囲外の方法、 public String hello()
文字列が返されることなく)...それを修正した後、MyClassa-> force.com->テストを実行し、問題なく完全なコードカバレッジを取得したので、問題なく完全なコードカバレッジを取得しました。
これがどのように見えるかです: http://dl.dropbox.com/u/709568/stackoverflow/masato_code_coverage.png
何が間違っているのかを考えようとしています...すべてのクラスがコンパイルされ、サーバー側に保存されたと確信していますか?テスト方法は機能と同じクラスまたは別々のクラスに配置しましたか(通常、私は同様の名前の別々のクラス名を作成しました MyClassATest
)。それが別のクラスの場合 - どのファイルで「テストの実行」をクリックしましたか?最後になりましたが、サンドボックスから生産までの展開中にこの問題に直面している場合は、展開ウィザードで必要なすべてのクラスを選択したことを確認してください。
他のヒント
本当に「ユニット」テストを行いたい場合は、クラスBの動作とクラスAの動作をテストし、クラスBメソッドへの呼び出しをock笑する必要があります。
それは、模擬愛好家と他の人の間の厳しい会話です(マーティン・ファウラーは「モッカー」ではないと思います)。
ともかく。約100%のカバレッジを考えるのをやめるべきです。あなたは考えなければなりません:
なぜ私はテストしているのですか?
どのようにテストしていますか?
ここでは、私は間違いなく2つのテストに行きます:
BクラスのBクラスのテストファイルへの1つのテストは、すべての副作用、副次的な値など、Bメソッドが十分に実装されていることを確認します。
クラスBをock笑するクラスの1つのテスト
模擬とは何ですか?
非常にシンプルなままにするために:A模擬はテストのコードの一部です。これは、Bクラスメソッドが呼び出される場合、常にこの値を返します: "+++"。
これを行うことで、メンテナンス可能でモジュール可能なテストスイートを手に入れることができます。
Javaでは、モキトが大好きです。 http://mockito.org/
私の同僚の一人は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);
}
すべてのモックオブジェクトに対してTestHelperと呼ばれるApexクラスを作成しました。私は、他の場所で必要とするかもしれない値に、オブジェクトにパブリック静的フィールドに定数(静的な最終)を使用します。うまく機能し、方法が使用されていないため、テストカバレッジは必要ありません。
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;
}
}
}