テストプロジェクト in Android junitテストケース(AndroidTestCaseを拡張))のコンテキストを取得する方法を知っている人はいますか。
注:このテストは計装テストではありません。
注2:テストする実際のアプリケーションのコンテキストではなく、テストプロジェクトのコンテキストが必要です。
テストプロジェクトのアセットからいくつかのファイルを読み込むためにこれが必要です。
Android Testing Support Library(現在androidx.test:runner:1.1.1
)。 Kotlinは例を更新しました:
class ExampleInstrumentedTest {
lateinit var instrumentationContext: Context
@Before
fun setup() {
instrumentationContext = InstrumentationRegistry.getInstrumentation().context
}
@Test
fun someTest() {
TODO()
}
}
アプリコンテキストも実行する場合:
InstrumentationRegistry.getInstrumentation().targetContext
完全な実行例: https://github.com/fada21/AndroidTestContextExample
ここを見てください: getTargetContext()とgetContext(InstrumentationRegistry)の違いは何ですか?
いくつかの調査の後、唯一の有効な解決策は、すでに指摘されているyorkwのようです。 InstrumentationTestCaseを拡張する必要があります。その後、getInstrumentation()。getContext()を使用してテストアプリケーションのコンテキストにアクセスできます。上記の提案を使用した簡単なコードスニペットを次に示します。
public class PrintoutPullParserTest extends InstrumentationTestCase {
public void testParsing() throws Exception {
PrintoutPullParser parser = new PrintoutPullParser();
parser.parse(getInstrumentation().getContext().getResources().getXml(R.xml.printer_configuration));
}
}
AndroidTestCaseソースコード で読むことができるように、getTestContext()
メソッドは隠されています。
_/**
* @hide
*/
public Context getTestContext() {
return mTestContext;
}
_
リフレクションを使用して_@hide
_注釈をバイパスできます。
AndroidTestCase
に次のメソッドを追加するだけです:
_/**
* @return The {@link Context} of the test project.
*/
private Context getTestContext()
{
try
{
Method getTestContext = ServiceTestCase.class.getMethod("getTestContext");
return (Context) getTestContext.invoke(this);
}
catch (final Exception exception)
{
exception.printStackTrace();
return null;
}
}
_
その後、getTestContext()
をいつでも呼び出します。 :)
更新:AndroidTestCase
このクラスはAPIレベル24で廃止されました。代わりにInstrumentationRegistry
を使用してください。新しいテストは、Android Testing Support Library。 発表へのリンク
TestCaseではなくAndroidTestCaseから拡張する必要があります。
AndroidTestCaseクラスの概要
アクティビティコンテキストに依存するリソースまたはその他のものにアクセスする必要がある場合は、これを拡張します。
KotlinとMockitoを使用してコンテキストを取得する場合は、次の方法で実行できます。
val context = mock(Context::class.Java)
私はあなたの助けを願っています
これは、コンテキストを取得する正しい方法です。他のメソッドはすでに非推奨です
import androidx.test.platform.app.InstrumentationRegistry
InstrumentationRegistry.getInstrumentation().context
import androidx.test.core.app.ApplicationProvider;
private Context context = ApplicationProvider.getApplicationContext();
他の答えは時代遅れです。現在、AndroidTestCaseを拡張するたびに、使用できるmContext Contextオブジェクトがあります。
プロジェクトのリソースへのアクセスだけが必要な場合は、getActivity()ActivityInstrumentationTestCase2 class のメソッドを使用できます。
//...
private YourActivityClass mActivity;
@Override
protected void setUp() throws Exception {
//...
mActivity = getActivity();
}
//...
public void testAccessToResources() {
String[] valueList;
valueList =
mActivity.getResources().getStringArray(
com.yourporject.R.array.test_choices);
}
JVMでのAndroid単体テストにRobolectric
を使用できます。
Robolectric
は、Android API。を使用しながら、単体テストを作成してデスクトップJVMで実行できるようにするフレームワークです。
Robolectric
は、Android.jarファイルのJVM準拠バージョンを提供します。 Robolectricは、ビューのインフレーション、リソースの読み込み、およびAndroidデバイスのネイティブCコードで実装されている他の多くのものを処理します。
dependencies {
...
// Robolectric
testCompile "org.robolectric:robolectric:3.3.2"
}
src/test
ディレクトリに保存する必要があります。@RunWith(RobolectricTestRunner.class
テストランナーの注釈を付ける必要があります。例えば
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
public class WelcomeActivityTest
{
private WelcomeActivity activity;
@Before
public void setUp() throws Exception
{
activity = Robolectric.buildActivity( WelcomeActivity.class )
.create()
.resume()
.get();
}
@Test
public void shouldNotBeNull() throws Exception
{
assertNotNull( activity );
}
}
続きを読む こちら