androidのライブラリを呼んでいるメソッドをテストするために、ApplicationTestCaseを使っていました。
ところが、targetSdkVersion=28にして、サポートライブラリをandroidXへ移行したら、ApplicationTestCaseが使えなくなっていました。これらは、APIレベル24 android 7で、非推奨になっていたんですね。
新規作成したプロジェクトのExampleInstrumentedTestクラスを見ながら、いくつかのApplicationTestCaseをAndroidJUnit4に移行してみました。機械的な編集作業+手作業で調整、でいけそうでした。
次のようなシェルスクリプトを作って、機械的な編集作業をsedに置換させました。
migrate_applicationtest_androidjunit4.sh
#!/bin/bash
set -u
set -e
#set -x
path=$1
grep "ApplicationTestCase" $path
not_found=$?
if [ $not_found != 0 ]; then
echo "not_found"
exit
fi
sed --in-place "2aimport android.content.Context;\n\nimport androidx.test.InstrumentationRegistry;\nimport androidx.test.runner.AndroidJUnit4;\n\nimport org.junit.After;\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport static org.junit.Assert.*;" $path
# import android.test.ApplicationTestCase;
sed --in-place "s/import android.test.ApplicationTestCase;//" $path
# public class
# ↓
# @RunWith(AndroidJUnit4.class)
# public class
sed --in-place "s/public class/@RunWith\(AndroidJUnit4.class\)\\npublic class/" $path
# extends xxx {
# ↓
# {
sed --in-place -r "s/extends \w+<\w+>//" $path
# コンストラクタを削除する
class_name=$(basename $path)
class_name=${class_name/.java/}
echo $class_name
sed --in-place -r ":lbl1;N;s/public $class_name.*?}//;b lbl1;" $path
# @Override を削除する
sed --in-place s/@Override// $path
# super.setUp(); を削除する
sed --in-place "s/super.setUp();//" $path
# super.tearDown(); を削除する
sed --in-place "s/super.tearDown();//" $path
# protected void setUp()
# ↓
# @Before
# public void setUp()
sed --in-place "s/protected void setUp/@Before\\n\\tpublic void setUp/" $path
# protected void tearDown()
#↓
# @After
# public void tearDown()
sed --in-place "s/protected void tearDown/@After\\n\\tpublic void tearDown/" $path
#public void test
#↓
#@Test
#public void test
sed --in-place "s/public void test_/@Test\\n\\tpublic void test/" $path
#Activity mActivity;
#↓
#Context mContext;
sed --in-place "s/Activity mActivity;/Context mContext;/" $path
sed --in-place s/mActivity/mContext/ $path
#getActivity()
#↓
#InstrumentationRegistry.getTargetContext()
sed --in-place -r "s/getActivity\b/InstrumentationRegistry.getTargetContext/" $path
#getContext()
#↓
#InstrumentationRegistry.getTargetContext()
sed --in-place -r "s/getContext\b/InstrumentationRegistry.getTargetContext/" $path
Code language: PHP (php)
次のように使います。作業用ブランチを新規作成してから、作業すると安心です。
$ find <androidプロジェクトルート>/app/src/androidTest/ -name "*.java" | xargs -l1 ./migrate_applicationtest_androidjunit4.sh
Code language: JavaScript (javascript)