标签: android-testing

Android单元测试 - 代码引用android类时的最佳实践

我有一个常规的JUnit测试用例来测试非android方法逻辑.该方法将TextUtils用于TextUtils.isEmpty()之类的东西.

我只是为了引入TextUtils类而使它成为AndroidTestCase是没有意义的.有没有更好的方法来测试这个单元测试?喜欢将android.jar添加到测试项目或其他什么?

与我想要模拟Context对象的另一个测试类似的情况.如果不扩展AndroidTestCase,我无法嘲笑它.在这些情况下,我只是尝试测试非Android逻辑并且不希望它在模拟器上运行,但它触及一些Android类的最佳实践是什么?

谢谢

junit android unit-testing android-testing

9
推荐指数
2
解决办法
2494
查看次数

在Android Studio中的Android Instrumentation测试和单元测试之间共享代码

可以在Android Studio中的这两种测试模式之间共享代码吗?我有一套Mock Utils类,我需要在两种测试模式下访问.

testing android gradle android-testing android-studio

9
推荐指数
2
解决办法
780
查看次数

如何在测试期间调用oncreate之前获取活动引用

如何在调用onCreate之前获取Activity的引用.而它的测试.我使用ActivityTestRule作为JUnit规则.这个要求的原因是我想从测试中将Mocks注入活动.

public class MyActivity extends Activity{

    MyComponent myComponent;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        if(myComponent==null){
            myComponent ... //initialise dagger component
        }
        myComponent.inject(this);
        ...
    }

    public void setComponent(MyComponent comp){
        this.myComponent = comp;
    }
}

public class MyTest{

    @Rule
    public ActivityTestRule<MyActivity> intentsTestRule = new ActivityTestRule<>(MyActivity.class);


    MyComponent myFakeComponent;

    @Before                                      
    public void setUp() {                        
        MyActivity activity = intentsTestRule.getActivity();  
        activity.setComponent(myFakeComponent);
    }                                            

    @Test
    public void testMethod1(){...}
} 
Run Code Online (Sandbox Code Playgroud)

android mocking android-testing junit-rule android-espresso

9
推荐指数
2
解决办法
6254
查看次数

如何在android中模拟MotionEvent和SensorEvent进行单元测试?

如何单元测试android SensorEventMotionEvent类?

我需要MotionEvent为单元测试创建一个对象.(我们有模拟创建自定义对象后可以使用的obtain方法)MotionEventMotionEvent

对于MotionEvent类,我试过Mockito像:

MotionEvent Motionevent = Mockito.mock(MotionEvent.class);
Run Code Online (Sandbox Code Playgroud)

但是我在Android Studio上遇到错误:

java.lang.RuntimeException:

Method obtain in android.view.MotionEvent not mocked. See https://sites.google.com/a/android.com/tools/tech-docs/unit-testing-support for details.
    at android.view.MotionEvent.obtain(MotionEvent.java)
Run Code Online (Sandbox Code Playgroud)

关于此错误提到的网站,我已添加

testOptions {
        unitTests.returnDefaultValues = true
    }
Run Code Online (Sandbox Code Playgroud)

在build.gradle上,但我仍然得到同样的错误.有什么想法吗?

android mockito android-sensors android-testing

9
推荐指数
1
解决办法
2196
查看次数

底片的浓缩咖啡测试

我正在为底部工作表创建一个浓缩咖啡测试,其中工作表有 5 个线性排列的文本视图,第一个文本视图可见,单击第一个文本视图将展开整个底部工作表,显示所有项目,然后需要单击第三个项目要通过的测试。

问题是浓缩咖啡在展开后不会单击底部工作表的文本视图,直到我将Thread.sleep(1000).

我什至尝试过 IdlingResource,一旦在第一个项目上注册了点击,我就把它设置为 false,在 bottomSheetBehaviour 上调用 onStateChanged 之后,我再次将它设置为 true,但仍然没有帮助。

这不起作用:

onView(withId(R.id.toolsItem1)).perform(click());
onView(withId(R.id.toolsItem3)).check(matches(isDisplayed()));
onView(withId(R.id.toolsItem3)).perform(click());
Run Code Online (Sandbox Code Playgroud)

这确实:

onView(withId(R.id.toolsItem1)).perform(click());
Thread.sleep(1000);
onView(withId(R.id.toolsItem3)).check(matches(isDisplayed()));
onView(withId(R.id.toolsItem3)).perform(click());
Run Code Online (Sandbox Code Playgroud)

android android-testing android-espresso bottom-sheet

8
推荐指数
1
解决办法
2993
查看次数

发现多个文件与操作系统无关的路径“mockito-extensions/org.mockito.plugins.MockMaker”

发现多个文件与操作系统无关的路径'mockito-extensions/org.mockito.plugins.MockMaker'在添加时出现此错误 androidTestImplementation "org.mockito:mockito-inline:2.15.0"

在 gradle 中模拟最后一堂课

android mockito kotlin android-testing

8
推荐指数
1
解决办法
2901
查看次数

Jetpack AndroidX 测试“一次编写,随处运行”——但在任何地方运行的最佳方式是什么?

最近我展示了一个关于 androidX 测试的谷歌 IO 视频,其中引用了“一次编写,到处运行”。这让我很高兴了解 androidX 测试库。

我发现经过很长时间谷歌为开​​/关设备的单元测试和仪器测试提出了很好的单一库。但是我发现在开/关设备上运行相同的测试有些困难。

基本上在 Android 中,我们创建了两个源根test/javaandroidTest/java分别存储单元测试和仪器测试。单元测试在 JVM 上运行,Instrumentation 在设备/模拟上运行。

然后我为test/java目录中的片段之一编写了测试。

@RunWith(AndroidJUnit4::class)
class MyFragmenTest {

    lateinit var scenario: FragmentScenario<MyFragment>

    @Before
    fun setUp() {
        scenario = launchFragmentInContainer<MyFragment>()
    }

    @Test
    fun `sample test`() {
        scenario.onFragment {
           // something 
        }

        // some assertion
    }
}
Run Code Online (Sandbox Code Playgroud)

所以当我使用小的绿色运行图标执行这个测试时,它在没有模拟器的 JVM 中运行这个测试,这很棒。但是要在设备上运行相同的测试,我必须移动此代码androidTest/java源根目录。

基本上我得到了相同的测试可以在任何地方运行,当我们使用 androidX 测试库时,您不必依赖不同的工具和库来完成相同的工作。

我试过的。

之后,在 google 上搜索我发现我们必须sharedTest/java使用下面的 gradle 行创建源根目录,以便它可以在设备上或设备外运行。

android {
    ...  
    sourceSets {
        androidTest {
            java.srcDirs += "src/sharedTest/java"
        }
        test …
Run Code Online (Sandbox Code Playgroud)

android android-testing android-jetpack androidx androidx-test

8
推荐指数
1
解决办法
170
查看次数

java.lang.AssertionError:活动永远不会成为请求状态

执行单元测试时出现以下错误

java.lang.AssertionError: Activity never becomes requested state "[CREATED, STARTED, RESUMED, DESTROYED]" (last lifecycle transition = "PRE_ON_CREATE")
at androidx.test.core.app.ActivityScenario.waitForActivityToBecomeAnyOf(ActivityScenario.java:338)
at androidx.test.core.app.ActivityScenario.launchInternal(ActivityScenario.java:272)
at androidx.test.core.app.ActivityScenario.launch(ActivityScenario.java:238)
at androidx.test.ext.junit.rules.ActivityScenarioRule.lambda$new$3$ActivityScenarioRule(ActivityScenarioRule.java:98)
at androidx.test.ext.junit.rules.ActivityScenarioRule$$Lambda$3.get(Unknown Source:4)
at androidx.test.ext.junit.rules.ActivityScenarioRule.before(ActivityScenarioRule.java:103)
at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:46)
Run Code Online (Sandbox Code Playgroud)

我的测试代码

@RunWith(AndroidJUnit4::class)
@LargeTest
class TestHomePageFragment {


    private val intent = Intent(ApplicationProvider.getApplicationContext(), AudioPlayerActivity::class.java).apply {
        flags = Intent.FLAG_ACTIVITY_NEW_TASK
        putExtra(HomePageArouterConstants.KEY_ID,"1")
    }
    @get:Rule
     val activityRule:ActivityScenarioRule<AudioPlayerActivity> = activityScenarioRule(intent)


    @Test
    fun testVote(){
//        Assert.assertEquals(1,1)
        val scenario = activityRule.scenario
        scenario.moveToState(Lifecycle.State.RESUMED)
        onView(withId(R.id.linear_layout_like)).perform(click())
    }

}
Run Code Online (Sandbox Code Playgroud)

谁有这个问题的想法?

android android-testing android-espresso

8
推荐指数
0
解决办法
1241
查看次数

Android GrantPermissionRule 不适用于 api-27

我在我的MainActivityTest班级中配置了如下权限规则

@Rule
public GrantPermissionRule permissionRule =
    GrantPermissionRule.grant(RECORD_AUDIO, WRITE_EXTERNAL_STORAGE);
Run Code Online (Sandbox Code Playgroud)

当我运行以下命令以使用 api 27 在模拟器上执行测试时

./gradlew connectedCheck
Run Code Online (Sandbox Code Playgroud)

它失败并出现以下错误

com.example.myapplication.MainActivityTest > testLaunch_main_activity[Pixel_XL_API_27(AVD) - 8.1.0] FAILED 
        androidx.test.espresso.NoActivityResumedException: No activities in stage RESUMED. Did you forget to launch the activity. (test.getActivity() or similar)?
        at dalvik.system.VMStack.getThreadStackTrace(Native Method)
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,权限在应用程序信息设置中显示为已授予,但在 api 版本 27(或更低版本)的模拟器上运行测试时仍然要求权限

有人可以确认这是否是某些 android 插件中的错误,或者我在这里遗漏了什么。

源代码- https://github.com/vivekweb2013/test-android-project

android android-fragments android-testing android-permissions androidx

8
推荐指数
1
解决办法
216
查看次数

Android 测试由于 Hilt 依赖而失败

我有以下 android 测试类

@HiltAndroidTest
@UninstallModules(PreferencesModule::class, CacheModule::class)
class PlayerRepositoryTest {

private val fakeServer = FakeServer()
private lateinit var repository: PlayerRepository
private lateinit var api: GameApi
private lateinit var cache: Cache

@get: Rule
var hiltRule = HiltAndroidRule(this)

@get: Rule
var instantTaskExecutorRule = InstantTaskExecutorRule()

@Inject
lateinit var database: GameDatabase

@Inject
lateinit var retrofitBuilder: Retrofit.Builder


@Inject
lateinit var apiPlayerMapper: ApiPlayerDetailsMapper

@Inject
lateinit var apiPaginationMapper: ApiPaginationMapper

@BindValue
@JvmField
val preferences: Preferences = FakePreferences()

@Module
@InstallIn(SingletonComponent::class)
object TestCacheModule {

    @Provides
    fun provideRoomDatabase(): GameDatabase {
        return Room.inMemoryDatabaseBuilder( …
Run Code Online (Sandbox Code Playgroud)

android android-testing dagger-hilt

8
推荐指数
0
解决办法
566
查看次数