标签: android-unit-testing

Android 单元测试因 java.lang.IllegalArgumentException 失败:需要 INTERNET 权限

我正在尝试为我的应用程序设置单元测试。但我遇到了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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

失败并出现以下错误:

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)
Run Code Online (Sandbox Code Playgroud)

MyApplication 类正在初始化 Segment,如下所示:

override fun onCreate() {
val …
Run Code Online (Sandbox Code Playgroud)

android mockito robolectric android-viewmodel android-unit-testing

6
推荐指数
1
解决办法
724
查看次数

当使用返回流的存储库对视图模型进行单元测试时,将其转换为实时数据时会发生错误

我需要一些关于在 android 中编写单元测试的帮助,这些测试与视图模型、实时数据和流机制以及调度有关。

首先,我正在编写单元测试,而不是仪器测试。

实际上,我正在为一个 android 应用程序创建一个单元测试,用于测试使用存储库从互联网获取一些数据的 ViewModel。

我使用的视图模型的代码是这样的:

class ViewModel(private var repository: Repository? = Repository()) :
  androidx.lifecycle.ViewModel() {

  val data: LiveData<Result<Item>> = repository!!.remoteData.asLiveData()
}
Run Code Online (Sandbox Code Playgroud)

单元测试代码如下:

import junit.framework.TestCase
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.test.TestCoroutineDispatcher
import kotlinx.coroutines.test.resetMain
import kotlinx.coroutines.test.runBlockingTest
import kotlinx.coroutines.test.setMain
import org.junit.After
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mockito.`when`
import org.mockito.Mockito.mock
import org.mockito.junit.MockitoJUnitRunner

@ExperimentalCoroutinesApi
@RunWith(MockitoJUnitRunner::class)
class ViewModelTest : TestCase() {
    private val testDispatcher = TestCoroutineDispatcher()
    private lateinit var repository: Repository
    private lateinit var viewModel: ViewModel …
Run Code Online (Sandbox Code Playgroud)

unit-testing android-livedata android-viewmodel kotlin-flow android-unit-testing

5
推荐指数
1
解决办法
932
查看次数

收到错误 MockKException:找不到答案:Observer(#8).onChanged Android

我正在写一个单元测试。下面是我的代码。该架构是使用 Dagger2 的 MVVM。我正在调用 LoginViewModel 中的登录函数,该函数通知 getLoginState 函数。我收到的错误是:

错误:

 io.mockk.MockKException: no answer found for: Observer(#8).onChanged(Success(data=))
    
        at io.mockk.impl.stub.MockKStub.defaultAnswer(MockKStub.kt:90)
Run Code Online (Sandbox Code Playgroud)

登录ViewModel类:

 fun logIn(phone: String, phoneCode: String) {
        loginState.value = Outcome.success("")
}

 fun getLoginState(): LiveData<Outcome<String>> = loginState
 
Run Code Online (Sandbox Code Playgroud)

登录ViewModelTest类:

 @RelaxedMockK
    var SUT: LoginViewModel? = null

    @Mock
    var loginInteractor: LoginInteractor? = null

    @Mock
    var textValidator: TextValidator? = null

    @Mock
    var textProvider: TextProvider? = null

    @Mock
    var blinkUserPreferences: BlinkUserPreferences? = null

    @get:Rule
    var rule: TestRule = InstantTaskExecutorRule()

    @RelaxedMockK
    var mockObserver: Observer<Outcome<String>>? = null
    @Before
        fun setUp() { …
Run Code Online (Sandbox Code Playgroud)

android mockk android-unit-testing

5
推荐指数
1
解决办法
8461
查看次数

主 Looper 将未执行的可运行对象排队

我正在尝试在我的 RecyclerView 上运行单元测试。对于我的第一个测试,我想看看 RecyclerView 是否显示。

@RunWith(RobolectricTestRunner::class)
class WordListFragmentTest {

    // Executes task sin the Architecture component in the same thread.
    @get:Rule
    var instantTaskExecutorRule = InstantTaskExecutorRule()
    
    private lateinit var scenario: FragmentScenario<WordListFragment>

    private lateinit var viewModel: MainViewModel
    
    val word = Word("Word")
    
    @Before
    fun setup() {
        viewModel = mock(MainViewModel::class.java)


        scenario = launchFragment(
            factory = MainFragmentFactory(viewModel),
            fragmentArgs = null,
            themeResId = R.style.Theme_Words,
            initialState = Lifecycle.State.RESUMED
        )

    }

    @Test
    fun `recyclerView displayed`() {
        onView(withId(R.id.recyclerView))
            .check(matches(isDisplayed()))
    }
Run Code Online (Sandbox Code Playgroud)

运行测试后我收到以下错误。

java.lang.Exception: Main looper has queued unexecuted runnables. This …
Run Code Online (Sandbox Code Playgroud)

android robolectric android-recyclerview android-unit-testing

5
推荐指数
0
解决办法
2743
查看次数

如何对从 Paging 3 返回 PagingSource 的 Room Dao 查询进行单元测试

我的问题实际上很笼统。我想知道如何对从Paging 3返回PagingSourceRoom Dao查询进行单元测试。

我有一个Room Dao查询:

    @Query("SELECT * FROM database")
    fun getChocolateListData(): PagingSource<Int, Chocolate>
Run Code Online (Sandbox Code Playgroud)

我想知道如何对这个查询进行单元测试。

到目前为止我尝试过的(使用内存中的Room数据库进行测试):

@FlowPreview
@Test
fun saveChocolateToDbSavesData() = runBlocking {
    val dao: Dao by inject()

    val chocolate = Chocolate(
        name = "Dove"
    )
    dao.saveChocolate(chocolate) 

    val pagingSourceFactory = { dao.getChocolateListData() }
    val pagingDataFlow: Flow<PagingData<Chocolate>> = Pager(
        config = PagingConfig(
            pageSize = 50,
            maxSize = 200,
            enablePlaceholders = false
        ),
        pagingSourceFactory = pagingSourceFactory
    ).flow

    val chocolateListFlow = pagingDataFlow.testIn(coroutinesTestRule)
    Assert.assertEquals(PagingData.from(listOf(chocolate)), chocolateListFlow.emissions[0]) …
Run Code Online (Sandbox Code Playgroud)

android android-room kotlin-flow android-unit-testing android-paging-3

3
推荐指数
1
解决办法
533
查看次数

将 Android Studio 更新到 ArticFox 后运行单元测试时出现 NoClassDefFoundError | 2020年3月1日

未收到测试事件错误:

将 android studio 更新到 ArticFox 后运行单元测试时出现 NoClassDefFoundError | 2020年3月1日。

以下是完整的错误:

java.lang.NoClassDefFoundError: jdk/internal/reflect/GeneratedSerializationConstructorAccessor1
at jdk.internal.reflect.GeneratedSerializationConstructorAccessor1.newInstance(Unknown Source)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
at java.base/java.io.ObjectStreamClass.newInstance(ObjectStreamClass.java:1092)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2180)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1679)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:493)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:451)
at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:122)
at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:69)
at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:68)
at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:73)

Caused by: java.lang.ClassNotFoundException: jdk.internal.reflect.GeneratedSerializationConstructorAccessor1
at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
... 11 more
Run Code Online (Sandbox Code Playgroud)

我刚刚下载了最新的 android studio,克隆了一个项目并尝试运行单元测试。

我怎样才能解决这个问题?我正在使用嵌入式 JDK(Java 11.0)。

android android-testing android-studio android-unit-testing

2
推荐指数
1
解决办法
3202
查看次数