我在仓库类中有一个简单的函数,该函数将解析来自资产的静态响应并返回结果。我试着写一个单元测试的功能,但不知何故,我的测试失败。下面给出代码片段。
repo函数:
override suspend fun fetchTasks(): ApiResponse<TaskListData> {
val parsedResponse = context.parseJsonFile("tasks.json")
val result = parsedResponse?.fromJson<TaskListData>()
response =
if (result != null) ApiResponse.Success(result)
else ApiResponse.Failed(Throwable("Response Parsing Failed"))
return response
}
我的测试功能:
@get:Rule
val coroutineTestRule = MainCoroutineRule()
private val context: Context = mockk<Context>(relaxed = true)
// Create an instance of the class being tested
private val fetchTasksRepositoryImpl = FetchTasksRepositoryImpl(context)
@Test
fun `fetchTasks returns expected response`() = runTest {
// given
val testParsedResponse = "Test Response"
val fileName = "tasks.json"
every { context.parseJsonFile(fileName) } returns testParsedResponse
every { context.assets.open(fileName) } returns testParsedResponse.byteInputStream()
every { testParsedResponse.fromJson<TaskListData>() } returns TaskListData(
listOf()
)
val actualResponse = fetchTasksRepositoryImpl.fetchTasks()
// Assert that the actual response is equal to the mock response
assertTrue(actualResponse is ApiResponse.Success)
}
json解析函数:
fun Context.parseJsonFile(fileName: String): String? {
return try {
val inputStream: InputStream = this.assets.open(fileName)
val size: Int = inputStream.available()
val buffer = ByteArray(size)
inputStream.read(buffer)
inputStream.close()
String(buffer, Charsets.UTF_8)
} catch (ex: IOException) {
ex.printStackTrace()
null
}
}
错误当前我得到
Reported exception:
java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because "<local2>" is null
at ch.qos.logback.core.android.AndroidContextUtil.getMountedExternalStorageDirectoryPath(Unknown Source)
at ch.qos.logback.core.android.AndroidContextUtil.setupProperties(Unknown Source)
at ch.qos.logback.classic.util.ContextInitializer.autoConfig(Unknown Source)
at org.slf4j.impl.StaticLoggerBinder.init(Unknown Source)
at org.slf4j.impl.StaticLoggerBinder.<clinit>(Unknown Source)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Unknown Source)
at io.mockk.impl.log.JvmLogging.slf4jOrJulLogging(JvmLogging.kt:10)
at io.mockk.impl.JvmMockKGateway.<clinit>(JvmMockKGateway.kt:160)
io.mockk.MockKException: Missing calls inside every { ... } block.
at app//io.mockk.impl.recording.states.StubbingState.checkMissingCalls(StubbingState.kt:14)
at app//io.mockk.impl.recording.states.StubbingState.recordingDone(StubbingState.kt:8)
at app//io.mockk.impl.recording.CommonCallRecorder.done(CommonCallRecorder.kt:47)
at app//io.mockk.impl.eval.RecordedBlockEvaluator.record(RecordedBlockEvaluator.kt:60)
at app//io.mockk.impl.eval.EveryBlockEvaluator.every(EveryBlockEvaluator.kt:30)
at app//io.mockk.MockKDsl.internalEvery(API.kt:92)
at app//io.mockk.MockKKt.every(MockK.kt:104)
纠正我,我现在做错了什么!最好的解决方案是有帮助的。
1条答案
按热度按时间p8ekf7hl1#
此函数
testParsedResponse.fromJson<TaskListData>()
从未被调用。您在存储库中调用的
fromJson<TaskListData>()
不是您在测试中调用的fromJson<TaskListData>()
。您可以在测试函数中使用一个变量模拟
fromJson
,而存储库中的一个变量则是另一个变量。你应该创建一个类来 Package fromJson函数,然后你可以使用这个类对象来插入你的测试并在你的存储库中调用它。
示例:
那么在你的测试中