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

g0czyy6m  于 2022-11-08  发布在  Android
关注(0)|答案(4)|浏览(141)

我正在尝试对一个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();
}

谢谢

erhoui1w

erhoui1w1#

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

ioekq8ef

ioekq8ef2#

未测试:使用下面的方法是否有效,并且可能使用targetContext?

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

ltqd579y3#

当你使用JVM单元测试时,你没有真正的android上下文。对于你的情况,也许你可以尝试Android Instrumentation Test,它通常在你项目的“androidTest”目录中实现。

0kjbasz6

0kjbasz64#

如果您使用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"
    }
}

另请参阅Skip a parameter in MockK unit test, Kotlin以获取任何数据的字符串资源的结果。

相关问题