android: 従来のApplicationTestCaseをAndroidJUnit4に移行するには

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

次のように使います。作業用ブランチを新規作成してから、作業すると安心です。

$ find <androidプロジェクトルートェクトルートトルート/app/src/androidTest/ -name "*.java" | xargs -l1 ./migrate_applicationtest_androidjunit4.sh
タイトルとURLをコピーしました