我尝试在KMM项目的shared
模块中编写测试。在共享模块的build.gradle.kts文件中,我有以下内容:
sourceSets {
val commonMain by getting
val commonTest by getting {
dependencies {
implementation(kotlin("test-common"))
implementation(kotlin("test-annotations-common"))
//TODO: Hamcrest
//implementation("junit:junit:4.12")
//implementation("org.hamcrest:hamcrest-library:1.3")
//TODO: Mockk
//implementation("io.mockk:mockk:1.10.4")
}
}
//...
}
我也试过:
implementation(kotlin("[library]"))
结果是一样的IDE不再识别这些测试,我无法运行它们。
3条答案
按热度按时间xpcnnkqh1#
不幸的是,没有一个mocking库支持K/N(AFAIK)。
这里是Mockk's K/N和Mockk的K/JS问题,供将来参考,或者您也可以查看Touchlab's Karmok
关于Hamcrest,请参阅他们的问题here
编辑/更新
到2022年,上述答案不再成立。Mockk现在支持共享模块中的模拟。请在这里检查mockk.io添加以下依赖项,你应该是好的去
testImplementation "io.mockk:mockk-common:{version}"
模拟体验是无缝的,就像常规的Android单元测试用例一样。
exdqitrt2#
我收到了KMM团队的回复-我想我会把它放在这里以供参考
您只能使用支持公共源集中所有声明目标的多平台依赖项,因为这可能会用于所有目标的编译。Junit不是一个多平台库,它是JVM,所以你应该将它添加到你的jvm目标源集(如果你声明了android()target,则为androidMain)。检查此项目:例如https://github.com/Kotlin/kmm-sample/blob/master/shared/build.gradle.kts。
同样的问题涉及到其他依赖项--它们不是多平台的,所以你不能在一个公共源集中使用它们。
a6b3iqyw3#
目前大多数mocking库都是仅支持JVM的-- mockk 和 hamcrest。
有一些Kotlin多平台模拟库使用基于KSP的代码生成,具有有限的模拟支持,但也与Kotlin/Native兼容: