我正在接管一个Android项目,我希望为项目引入单元测试,以帮助避免可能的回归.
对于普通的java项目,我有两个源文件夹:src和test.在src源文件夹中包含了我所有的源文件和我的test源文件夹中包含了我所有的单元测试,我相信这是保持独立的测试从源头非常标准,所以你不必与他们发货.
我一直在网上阅读,Android应用程序的方法看起来有点不同.几个例子讨论为a设置第二个项目android test project然后引用它android project.
我想确认一些事情:
我有一个常规的JUnit测试用例来测试非android方法逻辑.该方法将TextUtils用于TextUtils.isEmpty()之类的东西.
我只是为了引入TextUtils类而使它成为AndroidTestCase是没有意义的.有没有更好的方法来测试这个单元测试?喜欢将android.jar添加到测试项目或其他什么?
与我想要模拟Context对象的另一个测试类似的情况.如果不扩展AndroidTestCase,我无法嘲笑它.在这些情况下,我只是尝试测试非Android逻辑并且不希望它在模拟器上运行,但它触及一些Android类的最佳实践是什么?
谢谢
问题
我有两个我要测试的Android类:
CommentContentProvider,它扩展ContentProvider并由SQLiteDatabase支持.CommentActivity,通过一个间接扩展Activity和访问.CommentContentProviderContentResolver我目前有两个测试类:
CommentContentProviderTest,扩展ProviderTestCase2<CommentContentProvider>和使用MockContentResolver.这很好用.CommentActivityTest,延伸ActivityInstrumentationTestCase2<CommentActivity>.除了CommentActivity访问的部分外,这种方法很好CommentContentProvider.问题是,当CommentActivity访问时CommentContentProvider,它通过标准这样做ContentResolver:
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver().query(...);
Run Code Online (Sandbox Code Playgroud)
因此,当CommentActivityTest运行时,它会启动CommentActivity,访问(读取和写入)生产数据库,如上面两行所示.
我的问题是如何在生产中CommentActivity使用标准ContentResolver,但MockContentResolver在测试期间.
相关问题
Activity.可能的解决方案
如果我可以通过启动的Intent注入ContentResolver(可能是a MockContentResolver或RenamingDelegatingContext),那将是很好的,但我不能这样做,因为s不是.CommentActivityContextParcelable …
android dependency-injection abstract-factory android-contentresolver android-testing
我需要使用espresso测试项目自动化我的UI测试以进行以下操作.
操作:
单击打开手机摄像头的按钮.捕获图像,并将图像保存在SD卡存储中.完成后还要在屏幕上更新小图像视图.
应用程序工作正常但是对于所有其他操作和类似的上述操作类型,一次又一次地手动测试它变得非常耗时.
android integration-testing unit-testing android-testing android-espresso
可以在Android Studio中的这两种测试模式之间共享代码吗?我有一套Mock Utils类,我需要在两种测试模式下访问.
在具有64位ARM的Android设备上,将有两个版本的库,32位和64位,它们的性能可能会有所不同.我想知道是否有办法强制应用程序使用32位或64位库.
我定义特定字段中BuildConfig用于获取URL运行时.因此,对于每种构建类型,我使用不同的字符串:
prod {
buildConfigField "String", "BASE_URL", "\"abc.com\""
}
debug {
buildConfigField "String", "BASE_URL", "\"efg.com\""
}
Run Code Online (Sandbox Code Playgroud)
在运行android测试时是否可以定义不同的URL?我试过把这个设置放在下面sourceSets->androidTest,但它不被接受.
android gradle android-testing android-gradle-plugin gradle-plugin
我在我的Android项目中添加了espresso测试,并在创建ActivityTestRule的行上获得了IncompatibleClassChangeError.我如何找出导致它的原因?
以下是导致错误的代码行:(HomePageScreenTest.java:27)
@Rule
public ActivityTestRule<HomePageActivity> homePageActivityTestRule = new ActivityTestRule<>(HomePageActivity.class);
Run Code Online (Sandbox Code Playgroud)
这是错误:
java.lang.IncompatibleClassChangeError: com.example.rocklee.mehmvp.HomePage.HomePageActivity
at dalvik.system.DexFile.defineClassNative(Native Method)
at dalvik.system.DexFile.defineClass(DexFile.java:226)
at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:219)
at dalvik.system.DexPathList.findClass(DexPathList.java:321)
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:54)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at com.example.rocklee.mehmvp.HomePage.HomePageScreenTest.<init>(HomePageScreenTest.java:27)
at java.lang.reflect.Constructor.newInstance(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:217)
at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:266)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:54) …Run Code Online (Sandbox Code Playgroud) 使用Room AutoMigrations时,它Migration本身会自动生成。但为了对迁移进行单元测试,我必须将一个Migration对象传递给runMigrationsAndValidate. 我应该在这里传递什么?
@RunWith(AndroidJUnit4::class)
class MigrationTest {
private val TEST_DB = "migration-test"
@Rule
val helper: MigrationTestHelper = MigrationTestHelper(
InstrumentationRegistry.getInstrumentation(),
MigrationDb::class.java.canonicalName,
FrameworkSQLiteOpenHelperFactory()
)
@Test
@Throws(IOException::class)
fun migrate1To2() {
var db = helper.createDatabase(TEST_DB, 1).apply {
// db has schema version 1. insert some data using SQL queries.
execSQL(...)
// Prepare for the next version.
close()
}
// Re-open the database with version 2 and provide
// Migration as the migration process.
db …Run Code Online (Sandbox Code Playgroud) 我有一个Composable有一个Text和Button。Text将显示P当前方向是否为纵向,L否则。单击Button会将方向更改为横向,(因此之后,应该将文本从 更改P为L)
这是可组合的
@Composable
fun MyApp() {
val currentOrientation = LocalConfiguration.current.orientation
val orientation = if (currentOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
"P"
} else {
"L"
}
val activity = LocalContext.current as Activity
Column {
Text(text = orientation)
Button(onClick = {
// change orientation to landscape
activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
}) {
Text(text = "DO IT")
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我测试的方法
@get:Rule
val composeRule = createComposeRule() …Run Code Online (Sandbox Code Playgroud) android android-testing android-instrumentation android-jetpack-compose