单元测试Android,从资源中获取字符串

新手上路,请多包涵

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

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

谢谢

原文由 Huan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 515
2 个回答

如果你使用 MockK ,它是一样的。

 @RunWith(AndroidJUnit4::class)
class YourClassUnitTest : TestCase() {

    @MockK
    private lateinit var resources: Resources

    @Before
    public override fun setUp() {
        MockKAnnotations.init(this)
    }

    @Test
    fun test() {
        every {
            resources.getQuantityString(R.plurals.age, YEARS, YEARS)
        } returns AGE
        every {
            resources.getString(
                R.string.surname,
                SURNAME
            )
        } returns TITLE

        // Assume you test this method that returns data class
        // (fields are calculated with getQuantityString and getString)
        val data = getData(YEARS, SURNAME)

        assertEquals(AGE, data.age)
        assertEquals(TITLE, data.title)
    }

    companion object {
        const val YEARS = 10
        const val AGE = "$YEARS years"
        const val SURNAME = "Johns"
        const val TITLE = "Mr. $SURNAME"
    }
}

另请参阅 在 MockK 单元测试中跳过参数,Kotlin 以获取任何数据的字符串资源的结果。

原文由 CoolMind 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您使用 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.sInicialLunes))
       .thenReturn(INITIAL_LUNES);

     alertaPOJO.setDiaByText(texto);

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

坚持使用 JVM 测试的原因有很多,最重要的一个原因是它们运行得更快。

原文由 Michal Harakal 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题