2016-07-23 5 views
2

クラスの単体テストは、別のクラスの静的メソッド、たとえばHelperClassに関係しています。 HelperClassにはシングルトンメンバーがあります。ユニットテストにはJunit、シングルトンメンバーをモックするにはPowermockitoを使用しました。しかし、シングルトンメンバーのメソッドの動作は一度しか指定できないことがわかりました。模擬シングルトンのメソッドが異なるテストケースで異なる動作をすることはできません

//the class to be tested 
class Activity { 
    public void enact() { 
     //some logic 
     String str = HelperClass.doSomething(); 
     //some other logic 
    } 
} 

class HelperClass { 
    private static final singleton = Singleton.getInstance(); 
    public static String doSomething() { 
     //some logic 
     AnObject obj; 
     try { 
      obj = singleton.doSomething(); 
     } catch (Exception1 e) { 
      //Some other logic 
      throw new Exception2("Some message" + e.getMessage(), e); 
     } 

     String val = obj.doSomething(); 
     return val; 
    } 
} 

class Singleton { 
    private Singleton instance = null; 
    private void Singleton() { /*some logic*/ } 
    public static Singleton getInstance() { 
     if (instance == null) { 
      Singleton(); 
     } 
     return instance; 
    } 
    public String doSomething() throws Exception1 { 
     //some logic 
    } 
} 

私のuintテストでは、この

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Singleton.class) 
class ActivityTest { 
    //some logic 
    private Activity activity; 

    @Before 
    public void setup() { 
     //some logic 
     PowerMockito.mockStatic(Singleton.class); 
     activity = new Activity(); 
    } 

    @Test(expected = Exception2.class) 
    void test1() { 
     Singleton mockSingleton = mock(Singleton.class); 
     when(mockSingleton.doSomething()).thenThrow(new Exception1("Test Exception1")); 
     PowerMockito.when(Singleton.getInstance()).thenReturn(mockSingleton); 

     activity.enact(); 
    } 

    @Test 
    void test2() { 
     Singleton mockSingleton = mock(Singleton.class); 
     when(mockSingleton.doSomething()).thenReturn(""); 
     PowerMockito.when(Singleton.getInstance()).thenReturn(mockSingleton); 

     activity.enact(); 
    } 
} 

のようになります。しかし、それは動作しません。 mockSingletondoSomething()の異なる動作を指定していますが、mockSingletonは、test1のように、Exception2を依然としてtest2にスローします。動作は一度しか指定できないようです。誰かがここで私がdoSomething()に異なった振る舞いを持たせる方法を教えてもらえますか?

+0

あなたが実行するMockitoは、ibstanceではなく、クラス用に動作し、静的なmockitoは、クラステスト用の状態を保持することができます。注釈はメソッドレベルで実行されます – Sarief

答えて

1

Signleton.getInstanceは、HelperClassが初期化されているときに1回だけ呼び出しています。このようにして、あなたは常に最初のテストからモックを使用します。これを解決するには、Singletonのインスタンスが必要になるたびにgetInstanceと呼ぶことができます。

したがって、HelperClassのコードは次のようになります。

class HelperClass { 
    public static String doSomething() { 
     //some logic 
     AnObject obj; 
     try { 
      obj = Singleton.getInstance().doSomething(); 
     } catch (Exception1 e) { 
      //Some other logic 
      throw new Exception2("Some message" + e.getMessage(), e); 
     } 

     String val = obj.doSomething(); 
     return val; 
    } 
} 

この方法では、すべての実行時に右のモックを取得します。

+0

うわー、これは本当にスマートで、うまくいきます!どうもありがとうございました! – nocandies

関連する問題