Android单元测试:Mockk io.mockk.MockKException:每个{...}块

lkaoscv7  于 2023-06-20  发布在  Android
关注(0)|答案(1)|浏览(176)

我在仓库类中有一个简单的函数,该函数将解析来自资产的静态响应并返回结果。我试着写一个单元测试的功能,但不知何故,我的测试失败。下面给出代码片段。
repo函数:

  1. override suspend fun fetchTasks(): ApiResponse<TaskListData> {
  2. val parsedResponse = context.parseJsonFile("tasks.json")
  3. val result = parsedResponse?.fromJson<TaskListData>()
  4. response =
  5. if (result != null) ApiResponse.Success(result)
  6. else ApiResponse.Failed(Throwable("Response Parsing Failed"))
  7. return response
  8. }

我的测试功能:

  1. @get:Rule
  2. val coroutineTestRule = MainCoroutineRule()
  3. private val context: Context = mockk<Context>(relaxed = true)
  4. // Create an instance of the class being tested
  5. private val fetchTasksRepositoryImpl = FetchTasksRepositoryImpl(context)
  6. @Test
  7. fun `fetchTasks returns expected response`() = runTest {
  8. // given
  9. val testParsedResponse = "Test Response"
  10. val fileName = "tasks.json"
  11. every { context.parseJsonFile(fileName) } returns testParsedResponse
  12. every { context.assets.open(fileName) } returns testParsedResponse.byteInputStream()
  13. every { testParsedResponse.fromJson<TaskListData>() } returns TaskListData(
  14. listOf()
  15. )
  16. val actualResponse = fetchTasksRepositoryImpl.fetchTasks()
  17. // Assert that the actual response is equal to the mock response
  18. assertTrue(actualResponse is ApiResponse.Success)
  19. }

json解析函数:

  1. fun Context.parseJsonFile(fileName: String): String? {
  2. return try {
  3. val inputStream: InputStream = this.assets.open(fileName)
  4. val size: Int = inputStream.available()
  5. val buffer = ByteArray(size)
  6. inputStream.read(buffer)
  7. inputStream.close()
  8. String(buffer, Charsets.UTF_8)
  9. } catch (ex: IOException) {
  10. ex.printStackTrace()
  11. null
  12. }
  13. }

错误当前我得到

  1. Reported exception:
  2. java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because "<local2>" is null
  3. at ch.qos.logback.core.android.AndroidContextUtil.getMountedExternalStorageDirectoryPath(Unknown Source)
  4. at ch.qos.logback.core.android.AndroidContextUtil.setupProperties(Unknown Source)
  5. at ch.qos.logback.classic.util.ContextInitializer.autoConfig(Unknown Source)
  6. at org.slf4j.impl.StaticLoggerBinder.init(Unknown Source)
  7. at org.slf4j.impl.StaticLoggerBinder.<clinit>(Unknown Source)
  8. at java.base/java.lang.Class.forName0(Native Method)
  9. at java.base/java.lang.Class.forName(Unknown Source)
  10. at io.mockk.impl.log.JvmLogging.slf4jOrJulLogging(JvmLogging.kt:10)
  11. at io.mockk.impl.JvmMockKGateway.<clinit>(JvmMockKGateway.kt:160)
  12. io.mockk.MockKException: Missing calls inside every { ... } block.
  13. at app//io.mockk.impl.recording.states.StubbingState.checkMissingCalls(StubbingState.kt:14)
  14. at app//io.mockk.impl.recording.states.StubbingState.recordingDone(StubbingState.kt:8)
  15. at app//io.mockk.impl.recording.CommonCallRecorder.done(CommonCallRecorder.kt:47)
  16. at app//io.mockk.impl.eval.RecordedBlockEvaluator.record(RecordedBlockEvaluator.kt:60)
  17. at app//io.mockk.impl.eval.EveryBlockEvaluator.every(EveryBlockEvaluator.kt:30)
  18. at app//io.mockk.MockKDsl.internalEvery(API.kt:92)
  19. at app//io.mockk.MockKKt.every(MockK.kt:104)

纠正我,我现在做错了什么!最好的解决方案是有帮助的。

p8ekf7hl

p8ekf7hl1#

此函数testParsedResponse.fromJson<TaskListData>()从未被调用。
您在存储库中调用的fromJson<TaskListData>()不是您在测试中调用的fromJson<TaskListData>()
您可以在测试函数中使用一个变量模拟fromJson,而存储库中的一个变量则是另一个变量。
你应该创建一个类来 Package fromJson函数,然后你可以使用这个类对象来插入你的测试并在你的存储库中调用它。
示例:

  1. class Parser {
  2. companion object {
  3. fun <T> fromJson(input: String) : T {
  4. val data = yourDataProcess()
  5. return data
  6. }
  7. }
  8. }

那么在你的测试中

  1. every { Parser.fromJson(responser) } returns TaskListData(listOf())
展开查看全部

相关问题