android - Android在应用程序内模拟应用程序上下文
问题描述
我在创建测试类时遇到问题。基本上我想测试执行网络调用的视图模型类。使用匕首注入类网络组件需要上下文参数来检查连接,这是我的视图模型:
class MyViewModel(application: Application): AndroidViewModel(application) {
@Inject lateinit var network: NetworkService
init {
DaggerNetworkComponent.builder().networkModule(NetworkModule(application.applicationContext))
.build().inject(this)
network.callNetwork()
}
}
测试类类似于
lateinit var myViewModel: MyViewModel
@Test
fun testMyNetwork() {
application = Mockito.mock(Application::class.java)
myViewModel = MyViewModel(application)
}
application.applicationContext
总是返回 null ,然后返回IllegalStateException
有什么解决办法吗?
解决方案
我认为这里有两种可能。我使用了第二个并且知道它有效,第一个是我的猜测。
(1)
你在嘲笑应用程序。然后您尝试使用它,applicationContext
但是您没有模拟它。您还需要模拟它:
val context = Mockito.mock(Context::class.java)
Mockito.`when`(application.applicationContext).thenReturn(context)
(2)
假设 1)您的测试是仪器测试 2)您正在使用子类Application
- 比如说MyApplication
.
然后,您必须创建它的子类 - 比如说TestMyApplication
. 下一步是创建 的子类AndroidJUnitRunner
,可能是这样的:
public class MyInstrumentationTestRunner extends AndroidJUnitRunner {
@Override
public Application newApplication(ClassLoader cl, String className, Context context)
throws InstantiationException, IllegalAccessException, ClassNotFoundException {
return Instrumentation.newApplication(TestMyApplication.class, context);
}
}
最后,你需要告诉 android 使用这个运行器:
allprojects {
ext {
....
testInstrumentationRunner = "com...MyInstrumentationTestRunner"
}
}
由于上述原因,应用程序上下文将是跨仪器测试的 TestMyApplication 实例。