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をコピーしました