Tac*_*nko 12 testing junit android 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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是测试:
@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);
}
Run Code Online (Sandbox Code Playgroud)
尝试时会崩溃 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();
}
Run Code Online (Sandbox Code Playgroud)
谢谢
Mic*_*kal 11
如果你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);
}
}
Run Code Online (Sandbox Code Playgroud)
JVM测试有很多原因,最重要的是,它们运行得更快.
小智 5
当您使用 JVM 单元测试时,您没有真正的 android 上下文。对于您的情况,也许您可以尝试 Android Instrumentation Test,通常它是在您项目的“androidTest”目录中实现的。
未经测试:使用下面的,可能还有 targetContext 是否可行?
android {
testOptions {
unitTests {
includeAndroidResources = true
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果你使用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"
}
}
Run Code Online (Sandbox Code Playgroud)
另请参阅在 MockK 单元测试中跳过参数,Kotlin获取任何数据的字符串资源结果。
归档时间: |
|
查看次数: |
12188 次 |
最近记录: |