クラスの単体テストは、別のクラスの静的メソッド、たとえば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();
}
}
のようになります。しかし、それは動作しません。 mockSingleton
のdoSomething()
の異なる動作を指定していますが、mockSingleton
は、test1
のように、Exception2
を依然としてtest2
にスローします。動作は一度しか指定できないようです。誰かがここで私がdoSomething()
に異なった振る舞いを持たせる方法を教えてもらえますか?
あなたが実行するMockitoは、ibstanceではなく、クラス用に動作し、静的なmockitoは、クラステスト用の状態を保持することができます。注釈はメソッドレベルで実行されます – Sarief