是否可以使用 kotlin-allopen gradle 插件通过 mockito 进行 android 测试?
我尝试将 kotlin-allopen 插件添加到我的 build.gradle 并定义注释。
buildscript {
ext.kotlin_version = '1.0.6'
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
}
}
apply plugin: 'com.android.application'
apply plugin: 'kotlin-allopen'
apply plugin: 'kotlin-android'
allOpen {
annotation("com.mycompany.OpenForTest")
}
Run Code Online (Sandbox Code Playgroud)
而这些用于注释本身
annotation class OpenForTest
Run Code Online (Sandbox Code Playgroud)
它对我不起作用。也许我错过了什么?
Kotlin的财产和开放财产有什么区别?下面的代码抱怨我将setter 设为私有,而Intellij则说开放属性不允许私有 setter 。什么是开放财产?
@RestController
open class ParameterController {
@Autowired
lateinit var parameterRepository: ParameterRepository
private set //error
}
Run Code Online (Sandbox Code Playgroud)
为什么上面的代码无效,但此代码有效?
open class ItemPrice{
lateinit var type: String
private set // ok
}
Run Code Online (Sandbox Code Playgroud)
编辑:我正在使用spring-allopen插件,并且将类显式标记为open没什么区别。
我有一个使用 Kotlin 的 android 模块,通过使用 kotlin-all 开放类,我确保我仍然可以使用 Mockito 模拟我的 Kotlin 类。问题是这种方法使得我的 Kotlin 类也在测试之外开放,现在有人可以扩展这个类,但我不想允许。
这是我的配置
apply plugin: "kotlin-allopen"
allOpen {
annotation("com.me.Open")
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法来启用此插件仅用于测试,允许模拟 Kotlin 类,同时停止 Kotlin 非开放类的扩展。任何想法?
顺便说一句,我不想使用mockito-inline插件,因为它明显减慢了我们的测试速度。
我在Kotlin下测试一个新的kotlin-allopen
和kotlin-spring
插件1.0.6
.
在我的一个@Transactional
注释类中,我有一个字段:
@JvmField val foo = null
Run Code Online (Sandbox Code Playgroud)
当我尝试构建项目时,我得到:
Error:(45, 5) Kotlin: JvmField can only be applied to final property
有没有正确的方法来解决这个问题?@JvmField
由于JUnit的原因,我需要现实代码@Rule
.通过删除@JvmField
和注释getter来管理"解决"问题.不确定是否有错误或功能.
我正在尝试为 android 添加allopen插件。
我把这个添加到我的build.gradle(.)
ext.kotlin_version = '1.3.61'
classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
Run Code Online (Sandbox Code Playgroud)
我把这个添加到我的app/build.gradle
apply plugin: 'kotlin-allopen'
apply plugin: 'io.fabric'
allOpen {
annotation('com.myapp.sidemodule.Mockable')
}
Run Code Online (Sandbox Code Playgroud)
由于项目结构的原因,注释与属于 App 的模块位于不同的模块中
我在 sidemodule/debug/Mockable 中添加了这个
@Target(AnnotationTarget.ANNOTATION_CLASS)
annotation class Mockable
Run Code Online (Sandbox Code Playgroud)
然后在 sidemodule/debug/OpenClass 中
@Mockable
@Target(AnnotationTarget.CLASS)
annotation class OpenClass
Run Code Online (Sandbox Code Playgroud)
然后在 sidemodule/release/OpenClass 中
@Target(AnnotationTarget.CLASS)
annotation class OpenClass
Run Code Online (Sandbox Code Playgroud)
我添加
@OpenClass
到了我注定要被嘲笑的班级但是,我仍然收到:
E/TestRunner: failed: testCanDetectBadResponse(com.myapp.test.core.SomeTests)
----- begin exception -----
org.mockito.exceptions.base.MockitoException:
Cannot mock/spy class com.myapp.models.MyResponse
Mockito cannot mock/spy because :
- final class
at com.nhaarman.mockitokotlin2.SpyingKt.spy(Spying.kt:52)
at com.myapp.test.core.SomeTests.testCanDetectBadResponse(SomeTests.kt:163)
at java.lang.reflect.Method.invoke(Native Method)
at …
Run Code Online (Sandbox Code Playgroud)