web-dev-qa-db-ja.com

Androidの単体テスト、リソースからのgetString

Androidアプリのユニットテストを実行しようとしています。res.stringリソースから文字列を取得する必要があります。テストするクラスはPOJOクラスです。 2つの言語のアプリの場合、このため、リソースから文字列を取得する必要があります。問題は、コンテキストまたはアクティビティを取得できないことです。可能ですか?インストルメンテーションテストで実行できることはわかっていますが、テストする必要がありますインストルメンテーションテスト(ブラックボックステスト)を実行する前に、いくつかの関数(ホワイトボックステスト)をテストします。

_public void setDiaByText(String textView) {
    getll_diaSeleccionado().clear();
    if (textView.contains(context.getResources().getString(R.string.sInicialLunes))) {
        getll_diaSeleccionado().add(0);
        getIsSelectedArray()[0] = true;
        getI_idiaSeleccionado()[0] =1;

    } else
    {
        getIsSelectedArray()[0] = false;
        getI_idiaSeleccionado()[0] =0;
    }
}
_

そしてこれがテストです:

_@Test
public void setDiaByTextView() {
    String texto = "L,M,X,J,V,S,D";

    alertaPOJO.setDiaByText(texto);

    assertEquals(alertaPOJO.getIsSelectedArray()[0], true);
    assertEquals(alertaPOJO.getI_idiaSeleccionado()[0], 1);
}
_

実行しようとするとクラッシュしますcontext.getResources().getString(R.string.sInicialLunes))

context.getResources().getString(R.string.sInicialLunes))または 'L'の代わりに 'Mon'を指定すると、完全に機能するので、リソースフォルダーにアクセスするためにコンテキストまたはアクティビティを取得できますか?

私はMockitoでテストしていますが、setUp関数は次のとおりです。

_@Before
public void setUp() throws Exception {

    MockitoAnnotations.initMocks(this);
    mContext = Mockito.mock(Alerta.class);
    Mockito.when(mContext.getApplicationContext()).thenReturn(mContext);

    alertaPOJO = new AlertaPOJO();
}
_

ありがとう

16
Tachenko

Contextのみを使用してStringリソースを取得する場合は、getResources().getString()の部分のみを次のようにモックしてみます(JUnit4表記を参照)。

@RunWith(MockitoJUnitRunner.class)
public class AlertaPOJOTest {

  @Mock
  Context mMockContext;

  @Test
  public void setDiaByTextView() {
     String texto = "L,M,X,J,V,S,D";
     when(mMockContext.getString(R.string.R.string.sInicialLunes))
       .thenReturn(INITIAL_LUNES);


     alertaPOJO.setDiaByText(texto);

     assertEquals(alertaPOJO.getIsSelectedArray()[0], true);
     assertEquals(alertaPOJO.getI_idiaSeleccionado()[0], 1);
   } 
}

JVMテストを続ける理由はたくさんありますが、最も重要なのは、テストがより速く実行されることです。

12
Michal Harakal

JVM単体テストを使用している間、実際のAndroidコンテキストがありません。あなたのケースでは、おそらくAndroid Instrumentation Testを試すことができます。通常、プロジェクトの「androidTest」ディレクトリに実装されています。

4
Sherlock

テストされていません:以下、おそらくtargetContextを使用するとうまくいきますか?

Android {
   testOptions {
     unitTests {
        includeAndroidResources = true
     }
  }
}
2
nAndroid