首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android测试/ Mockito: android.location.Location未被模仿

Android测试/ Mockito: android.location.Location未被模仿
EN

Stack Overflow用户
提问于 2016-04-25 04:25:20
回答 2查看 6.1K关注 0票数 5

我正在尝试学习基本的JUnit和Mockito测试在安卓上。我试图为一个简单的类编写单元测试,它代表需要位置信息的活动处理从location中查找用户的位置。

我一直试图创建“伪造位置”来进行测试:

代码语言:javascript
复制
@Test
public void testLocationReceived() throws Exception {
    Location fakeLocation = new Location(LocationManager.NETWORK_PROVIDER);
    fakeLocation.setLongitude(100);
    fakeLocation.setLatitude(-80);
    ...  
}

但我知道错误是:

代码语言:javascript
复制
java.lang.RuntimeException: Method setLongitude in android.location.Location not mocked.

我知道Android上的单元测试运行在JVM上,所以您没有访问任何需要操作系统/框架的权限,但这也是其中一种吗?

  • 如果是这样的话,您如何知道哪些类可以/不能在JVM上使用?
  • 除了基于JVM的单元测试之外,我现在还需要测试这个类吗?
EN

回答 2

Stack Overflow用户

发布于 2016-05-07 12:59:17

您应该在build.gradle (App)中添加以下内容:

代码语言:javascript
复制
testOptions {
        unitTests.returnDefaultValues = true
}

更多细节:http://tools.android.com/tech-docs/unit-testing-support#TOC-Method-...-not-mocked.-

票数 4
EN

Stack Overflow用户

发布于 2020-05-28 08:57:09

我有和你一样的铅。约翰·黄的回答帮助了我。您首先需要模拟这个位置,然后使用mockito将您想要的值放入.here是我的代码。

代码语言:javascript
复制
@RunWith(PowerMockRunner::class)
class MapExtensionTest {
 @Mock
    private lateinit var location: Location

    //region calculateDistance
    @Test
    fun `given a valid store and a valid location  to calculateDistance should return the correct distance`() {
        Mockito.`when`(store.coordinate).thenReturn(coordinate)
        Mockito.`when`(coordinate.latitude).thenReturn(FAKE_LAT)
        Mockito.`when`(coordinate.longitude).thenReturn(FAKE_LON)
        Mockito.`when`(location.latitude).thenReturn(FAKE_LAT1)
        Mockito.`when`(location.longitude).thenReturn(FAKE_LON1)
        val result = FloatArray(1)
        Location.distanceBetween(
            store.coordinate.latitude,
            store.coordinate.longitude,
            location.latitude, location.longitude, result
        )

        store.calculateDistance(location)

        Assert.assertTrue(store.distance == result[0].toDouble())
    }

别忘了,就像约翰说的

代码语言:javascript
复制
testOptions {
    unitTests.returnDefaultValues = true
}

如果您有带import的pb,那么这里是我的测试依赖项,但我不记得其中一个对本例很重要,所以请记住,您可能不需要所有的测试依赖。

代码语言:javascript
复制
//testing dependencies
testImplementation "junit:junit:$junitVersion"
testImplementation "org.mockito:mockito-inline:${mockitoInlineVersion}"
testImplementation "androidx.arch.core:core-testing:${coreTestingVersion}"
testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:${mockitoKotlinVersion}"
androidTestImplementation "org.mockito:mockito-android:${mockitoAndroidVersion}"
testImplementation group: 'org.powermock', name: 'powermock-api-mockito2', version: "${powerMockMockitoVersion}"
testImplementation group: 'org.powermock', name: 'powermock-module-junit4', version: "${powerMockjUnitVersion}"
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36832001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档