我正在尝试为我的应用程序设置单元测试。但是我遇到了Segment的问题
这是我的测试类:
@RunWith(RobolectricTestRunner::class)
@Config(sdk = [Build.VERSION_CODES.O_MR1])
class LoginViewModelTest {
private lateinit var viewModel: LoginViewModel
@Mock
private lateinit var authService: AuthService
@Mock
private lateinit var sharedPreferences: SharedPreferences
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
val mMyApplication = mock<Application>()
viewModel = LoginViewModel(mMyApplication, sharedPreferences, authService)
}
@Test
fun test_phone(){
viewModel.isPhone.observeForTesting {
val isPhone = LiveDataTestUtil.getValue(viewModel.isPhone) ?:
return@observeForTesting
Assert.assertFalse(isPhone)
}
}
}
此操作失败,并显示以下错误:
INTERNET permission is required.
java.lang.IllegalArgumentException: INTERNET permission is required.
at com.segment.analytics.Analytics$Builder.<init>(Analytics.java:1068)
at com.app.android.MyApplication.onCreate(MyApplication.kt:42)
MyApplication类正在如下初始化段:
override fun onCreate() {
val analytics: Analytics = Analytics.Builder( //This is where its failing
applicationContext,
this.getString(R.string.segmentApiKey)
)
.trackApplicationLifecycleEvents()
.build()
// Set the initialized instance as a globally accessible instance.
Analytics.setSingletonInstance(analytics)
}
我在堆栈溢出中找到了this
他们建议我们必须像这样初始化应用程序:
protected Context instance() {
ShadowApplication shadowApp = Shadows.shadowOf(this);
shadowApp.grantPermissions("android.permission.INTERNET");
return shadowApp.getApplicationContext();
}
将instance()
传递给段,如下所示:
Analytics.with(instance()).identify("userId", null, null);
我不认为这是正确的方式,因为我们正在修改单元测试的代码,这不是正确的方式IMHO。
我还是尝试了,但是失败了,因为它无法解析shadowApp.getApplicationContext()
我正在使用shadowApplication,方法是添加此
implementation 'org.robolectric:shadow-framework:4.6'
请帮我解决这个问题。提前感谢。
如果使用ShadowApplication是正确的方法,请帮助我了解发生了什么。我对这个代码片段的理解是,它是一个示例应用程序类或可以用于测试的东西。请cmiiw。
编辑:我的AndroidManifest.xml已经有了互联网权限〈uses-permission android:name=“android.permission.INTERNET”
1条答案
按热度按时间0pizxfdo1#
很显然我的设备出了点问题
我加了这些
并将我的测试类更改为如下所示: