Robolectric (バージョン 3) を使用して、Android プロジェクトのテスト ケースを作成しています。これが私の簡単なテストシナリオです:
テスト対象の関数は次のとおりです。
public class MyClass {
private Context mContext;
public MyClass(Context context) {
mContext = context;
}
//function under test
public boolean isScreenOn() {
PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
return powerManager.isScreenOn();
}
}
( isScreenOn()が Android API バージョン 20 から非推奨になっていることは知っていますが、私のテストは Android API 17 で実行するように設定されています)
テスト関数は次のとおりです。
@Test
@Config(sdk = Build.VERSION_CODES.JELLY_BEAN_MR1)
public void testIsScreenOn() {
//get Context
Context context = ShadowApplication.getInstance().getApplicationContext();
//get power manager
PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
//get shadow power manager
ShadowPowerManager shadowPowerManager = Shadows.shadowOf(powerManager);
//set screen off
shadowPowerManager.setIsScreenOn(false);
//isScreenOn() in MyClass returns true, why?
MyClass myObj = new MyClass(context);
AssertFalse(myObj.isScreenOn()); //Failed!
}
にShadowPowerManagerインスタンスを使用しましたsetIsScreenOn(false)
が、テスト中の関数は依然として isScreenOn() に対して true を返します。なんで?