首页 > 解决方案 > 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

有什么解决办法吗?

标签: androidunit-testingmockitoandroid-viewmodel

解决方案


我认为这里有两种可能。我使用了第二个并且知道它有效,第一个是我的猜测。

(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 实例。


推荐阅读