web-dev-qa-db-fra.com

Test unitaire Android, getString from resource

J'essaie de faire un test unitaire pour une application Android et j'ai besoin d'obtenir une chaîne de ressources res.string. La classe que je veux tester est une classe POJO. Je fais le application en deux langues, pour cette raison, je dois obtenir une chaîne de ressource. Le problème est que je ne peux pas obtenir le contexte ou l'activité, est possible? Je sais qu'avec le test d'instrumentation je peux le faire, mais je dois tester quelques fonctions (test boîte blanche) avant de faire le test d'instrumentation (test boîte noire). C'est la fonction que je dois tester:

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;
    }
}

Et voici le test:

@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);
}

Il plante lorsque vous essayez de faire context.getResources().getString(R.string.sInicialLunes))

Si je mets 'Mon' au lieu de context.getResources().getString(R.string.sInicialLunes)) ou 'L' cela fonctionne parfaitement donc, est-il possible d'obtenir le contexte ou l'activité afin d'accéder au dossier de ressources?

Je teste avec Mockito et la fonction setUp est:

@Before
public void setUp() throws Exception {

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

    alertaPOJO = new AlertaPOJO();
}

Merci

16
Tachenko

Si vous utilisez Context uniquement pour obtenir la ressource String, j'irais en se moquant uniquement de getResources().getString() partie comme celle-ci (voir la notation 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);
   } 
}

Il existe de nombreuses raisons de rester avec les tests JVM, le plus important étant qu'ils s'exécutent plus rapidement.

12
Michal Harakal

Vous n'avez pas de véritable contexte Android pendant que vous utilisez le test unitaire JVM. Pour votre cas, vous pouvez peut-être essayer Android Test d'instrumentation, généralement c'est implémenté dans le répertoire "androidTest" de votre projet.

4
Sherlock

Non testé: cela fonctionnerait-il pour utiliser ce qui suit, et probablement targetContext?

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