2016-03-18 6 views
1

テストの実行中に静的メソッド呼び出しを無視する方法を探しています。java - テストが実行されているときにのみクラスまたはメソッドを無視する方法

私のテストランナーは、robolectricです。テストが実行されているときに実行したくないメソッドがあります。私が使用できるアノテーションやテクニックはありますか?私はテストの条件文、例えばを持つ避けたい

public class FabicTrackerUtils { 

    private static void trackLoginActivity(LoginEvent loginEvent) { 
     //... 
     Answers.getInstance().logLogin(loginEvent); 
    } 

    private static void trackPaymentsActivity(PaymentEvent paymentEvent) { 
     //... 
     Answers.getInstance().logLogin(paymentEvent); 
    } 
} 

:私は単に無視必要

私のユーティリティクラスは次のようになりますif(!robolectricTest)私の生産コードのすべてのメソッド。

+2

これは私に示唆することは、あなたが代わりに持つのは、no loggingしませんあなたのテストで偽 'Answers'インスタンスを注入しなければならないということです静的な 'Answers.getInstance()'です。 –

答えて

4

@Louisのコメントで詳しく説明すると、あなたは依存性注入を使うべきです。代替

private static void trackLoginActivity(LoginEvent loginEvent, Answers answers) { 
    //... 
    answers.logLogin(loginEvent); 
} 

Answersインスタンスがシングルトンのように見えるので、例えば、インスタンス変数としてオブジェクトを注入することである:これらのようなメソッドシグネチャを有することによって

public class FabicTrackerUtils { 
    private Answers answers; 

    public FabicTrackerUtils(Answers answers) { 
     this.answers = answers; 
    } 

    private static void trackLoginActivity(LoginEvent loginEvent) { 
     //... 
     answers.logLogin(loginEvent); 
    } 
} 

これは、と仮定されていますテストはFabicTrackerUtilsをインスタンス化し、模擬Answersインスタンスを渡すことができます。これが不可能な場合は、FabicTrackerUtilsにアクセサメソッドを追加したい:

public class FabicTrackerUtils { 
    private Answers answers; 

    public setAnswers(Answers answers) { 
     this.answers = answers; 
    } 

    private static void trackLoginActivity(LoginEvent loginEvent) { 
     //... 
     answers.logLogin(loginEvent); 
    } 
} 
+0

すばらしい答え。このリンクはそれを固めた。 https://medium.com/@fabioCollini/android-testing-using-dagger-2-mockito-and-a-custom-junit-rule-c8487ed01b56#.vu3i4eqnj – j2emanue