しばらく前にRobolectricの使用を開始しましたが、現在、独自のシャドウオブジェクトの作成でいくつかの問題が発生しています。基本的にデータベーステーブルのonCreateメソッドのみを呼び出すカスタマイズされたSQLiteOpenHelperクラスの動作をテストするコードをいくつか作成しました。
@RunWith(SharedDatabaseHelperTestRunner.class)
public class SharedDatabaseHelperTest {
private SharedDatabaseHelper helper;
@Before
public void setUp()
throws Exception {
helper = new SharedDatabaseHelper(Robolectric.application);
@Test
public void shouldCallOnCreateOfDatabaseTables()
throws Exception {
helper.onCreate(null);
assertTrue(ShadowTweetTable.onCreateCalled);
}
@Test
public void shouldCallOnUpdateOfDatabaseTables()
throws Exception {
helper.onUpgrade(null, 0, 0);
assertTrue(ShadowTweetTable.onUpgradeCalled);
}
データベーステーブルのシャドウオブジェクトは、いくつかのブール変数のみを設定し、onCreateが呼び出されるようにします。
@Implements(TweetTable.class)
public class ShadowTweetTable {
public static boolean onCreateCalled = false;
public static boolean onUpgradeCalled = false;
@Implementation
public static void onCreate(SQLiteDatabase database) {
onCreateCalled = true;
}
@Implementation
public static void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) {
onUpgradeCalled = true;
}
テストを実行しているとき、RobolectricTestRunnerは、カスタマイズされたテストランナーがシャドウクラスをバインドしていても、TweetTableにはシャドウフィールドがないことを通知します。
パブリッククラスSharedDatabaseHelperTestRunnerはRobolectricTestRunnerを拡張します{
public SharedDatabaseHelperTestRunner(Class<?> testClass)
throws InitializationError {
super(testClass);
}
@Override
protected void bindShadowClasses() {
Robolectric.bindShadowClass(ShadowTweetTable.class);
}
}