单元测试Android,来自资源的getString

时间:2016-09-19 15:24:21

标签: android testing junit mockito

我正在尝试为Android应用程序进行单元测试,我需要从res.string资源获取一个字符串。我想测试的类是POJO类。我正在用两种语言做应用程序,因此,我需要从资源中获取一个字符串。问题是我无法获得上下文或活动,是否可能?我知道使用Instrumentation测试我可以做到,但我需要在进行仪器测试(黑盒测试)之前测试一些功能(白盒测试)。 这是我必须测试的功能:

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))

时崩溃

如果我将'Mon'代替context.getResources().getString(R.string.sInicialLunes))或'L',那么它是否可以正常工作,是否可以获取上下文或活动以访问资源文件夹?

我正在使用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();
}

由于

3 个答案:

答案 0 :(得分:9)

如果您仅使用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测试的原因有很多,最重要的是,它们运行得更快。

答案 1 :(得分:3)

在使用JVM单元测试时,您没有真正的Android上下文。对于您的情况,也许您可​​以尝试Android Instrumentation Test,通常它是在" androidTest"你的项目目录。

答案 2 :(得分:2)

未经测试:使用以下内容(可能是targetContext)是否可行?

android {
   testOptions {
     unitTests {
        includeAndroidResources = true
     }
  }
}