Kotlin Multiplatform wasmJs目标单元测试中如何导入二进制数据?
Kotlin Multiplatform wasmJs目标单元测试中如何导入二进制数据?
我来帮你解决这个Kotlin/Wasm单元测试中加载二进制数据的问题——确实,WasmJs目标不像JVM那样能直接读取本地文件,不过有几个实用的方案可以搞定:
方法一:Base64编码嵌入(最直接,适配所有文件大小)
先把你的二进制文件转换成Base64字符串(用本地工具或者离线转换方式就行,不用上传到第三方网站),然后把这个字符串硬编码到测试代码里,再解码回ByteArray。
代码示例:import kotlin.text.Base64 import kotlinx.io.ByteArray class BinaryDataTest { // 替换成你的文件转出来的Base64字符串 private val testDataBase64 = "VGhpcyBpcyB0ZXN0IGJpbmFyeSBkYXRhLg==" private val testData: ByteArray get() = Base64.decode(testDataBase64) @Test fun testBinaryProcessing() { // 这里直接用testData进行测试逻辑 println("Loaded data size: ${testData.size}") } }这个方法的好处是完全不依赖环境配置,测试代码自包含,不会受Wasm资源加载的限制。
方法二:利用测试资源+Kotlin/Wasm的资源加载API(适合保留原始文件的场景)
如果你不想把数据转成字符串,想保留原始二进制文件,可以通过配置测试资源+fetchAPI来读取:- 先在项目里创建测试资源目录,比如
src/commonTest/resources,把你的二进制文件(比如test-data.bin)放入其中。 - 在
build.gradle.kts里确保wasmJs测试的资源被正确配置:kotlin { wasmJs { testRuns.named("test") { executionTask.configure { useKarma() // 如果你用Karma作为测试运行器 } } } sourceSets { val commonTest by getting { resources.srcDir("src/commonTest/resources") } } } - 在wasmJs的测试代码里用协程+
fetch读取资源(记得用runTest包装协程测试):import kotlinx.coroutines.runTest import kotlinx.io.ByteArray import org.w3c.fetch.fetch class ResourceDataTest { @Test fun testWithResource() = runTest { // 资源路径对应资源目录里的文件 val response = fetch("test-data.bin") require(response.ok) { "Failed to load test resource" } val arrayBuffer = response.arrayBuffer() val testData = arrayBuffer.toByteArray() // 这里编写你的测试逻辑 } }
注意:这个方法依赖测试运行器(比如Karma)正确把资源暴露给测试环境,要确保配置没有出错。
- 先在项目里创建测试资源目录,比如
方法三:用expect/actual实现跨平台统一测试(多目标KMP项目推荐)
如果你需要在所有目标(JVM、WasmJs等)里复用同一份测试逻辑,可以用KMP的expect/actual机制隔离平台差异:- 在commonTest里定义一个期望函数:
expect fun loadTestBinaryData(): ByteArray - 在wasmJsTest里实现actual函数(用上面的Base64或者资源加载方式):
actual fun loadTestBinaryData(): ByteArray { // 这里用Base64解码的实现示例 val base64Str = "你的Base64字符串" return Base64.decode(base64Str) } - 在JvmTest里实现actual函数(用传统的文件读取):
import java.io.File actual fun loadTestBinaryData(): ByteArray { return File("src/commonTest/resources/test-data.bin").readBytes() }
这样在commonTest的测试代码里,你只需要调用
loadTestBinaryData(),完全不用关心当前是哪个平台,测试逻辑可以100%复用。- 在commonTest里定义一个期望函数:
备注:内容来源于stack exchange,提问作者mipa
相关产品推荐
相关产品推荐

