testable-mock icon indicating copy to clipboard operation
testable-mock copied to clipboard

Android 项目无法Mock

Open Leiii-Li opened this issue 4 years ago • 13 comments

@MockWith(AuthorPageViewModel.class) public class AuthorPageViewModelTest { AuthorPageViewModel model;

public static class Mock {
    @MockMethod(targetClass = AuthorPageViewModel.class, targetMethod = "attachDeviceInfo", scope = MockScope.GLOBAL)
    private void attachDeviceInfo(Application application) {
        return;
    }
}

public AuthorPageViewModelTest() {
    model = OmniConstructor.newInstance(AuthorPageViewModel.class);
}

@Test
public void fetchData() {
    model.fetchAuthorInfo("999");
}

}

Leiii-Li avatar Apr 21 '21 05:04 Leiii-Li

public class AuthorPageViewModel extends AndroidViewModel { private static final String TAG = "AuthorPageViewModel";

public AuthorPageViewModel(@NonNull Application application) {
    super(application);
    attachDeviceInfo(application);
}

private void attachDeviceInfo(Application application) {
    mDeviceInfo = new DeviceInfo();
    DeviceUtils.setDeviceAbout(mDeviceInfo, application);
}

}

Leiii-Li avatar Apr 21 '21 05:04 Leiii-Li

在执行 fetchData test 时。无法mock attachDeviceInfo

Leiii-Li avatar Apr 21 '21 05:04 Leiii-Li

Android项目添加jvmArgs参数的方式稍有不同,见使用文档末尾处,先确认一下是否与这个问题有关。

linfan avatar Apr 21 '21 06:04 linfan

Android项目添加jvmArgs参数的方式稍有不同,见使用文档末尾处,先确认一下是否与这个问题有关。

是添加在build.gradle 末尾吗

Leiii-Li avatar Apr 21 '21 07:04 Leiii-Li

目前添加在配置文件末尾,或android 标签内部都无法生效

Leiii-Li avatar Apr 21 '21 07:04 Leiii-Li

这个框架是必须基于Robolectric?不能是源生的Junit吗

Leiii-Li avatar Apr 21 '21 07:04 Leiii-Li

如果有个Android项目Demo就好了

Leiii-Li avatar Apr 21 '21 07:04 Leiii-Li

原生JUnit在虚拟机里运行单元测试的这种不行,因为Android虚拟机用的字节码和标准JVM不一样。 一般来说Android项目都推荐用Robolectric来做单元测试,虚拟机运行单元测试每次等启动的时间太长了。

linfan avatar Apr 21 '21 07:04 linfan

使用Robolectric+Testable ?

Leiii-Li avatar Apr 21 '21 07:04 Leiii-Li

Robolectric+Testable 是确定可行的,而且Android项目推荐搭配Robolectric做单元测试,能省很多等虚拟机启动的时间

linfan avatar Apr 21 '21 08:04 linfan

我上面描述的哪个问题目前有解决办法吗

Leiii-Li avatar Apr 22 '21 09:04 Leiii-Li

可以解决,但前提是要用到Robolectric,直接安卓虚拟机运行单元测试的话,因为安卓的字节码和标准JVM不一样,不支持。 近期会补充一个Android的Robolectric示例工程,到时候可以参考一下。

linfan avatar Apr 22 '21 10:04 linfan

已增加demo/android-demo示例,可进入改目录通过./gradlew build运行。

这个示例是包含了Robolectric工具的,但如果不涉及Android的内置类,实测无需引入Robolectric

linfan avatar May 02 '21 14:05 linfan