当前位置: 首页 > 知识库问答 >
问题:

Kotlin/Mockito:如何从Kotlin.Annotation中模拟“AnnotationClass”

伍昱
2023-03-14

我想模拟注释来检查根据给定注释返回结果的类的良好行为。

@Test
fun <T> supports_when_field_has_OneToOne_annotation_with_eager_fetch_type() {
    val myHandler = MyHandler<T>()

    val joinAnnotation = mock<OneToOne> {
        on { this.fetch }.thenReturn(FetchType.EAGER)
        onGeneric { this.annotationClass }.thenReturn(OneToOne::class)
    }
    val supports = myHandler.supports(joinAnnotation)

    assertThat(supports).isTrue()
}

Erg.mockito.exceptions.misusing.WurnTypeOfReturnValue:annotationType()不能返回KClassImpl annotationType()应该返回Class

如果你不确定为什么你会超过错误,请继续阅读。由于语法的性质,上面的问题可能会发生,因为:

  • 此异常可能发生在错误编写的多线程测试中。请参阅关于并发测试限制的Mockito常见问题。
  • 使用when(spy.foo()).then()语法对间谍进行拦截。截断间谍更安全-
    • 和doReturnThrow()方法家族。有关mockito.spy()方法的javadocs的更多信息。
    onGeneric { this.annotationClass }.thenReturn(OneToOne::class)
    

    我不明白为什么我会有一个错误,为什么这个错误与annotationType()(java注释方法)有关?

    有人有办法解决这个问题吗?

共有1个答案

顾骏祥
2023-03-14

我找到了解决问题的办法。

kotlin.annotation.annotationClass是kotlin扩展函数:

/**
 * Returns a [KClass] instance corresponding to the annotation type of this annotation.
 */
public val <T : Annotation> T.annotationClass: KClass<out T>
    get() = (this as java.lang.annotation.Annotation).annotationType().kotlin as KClass<out T>

此函数调用java.lang.annotation.annotation.annotationType()

@Test
fun <T> supports_when_field_has_OneToOne_annotation_with_eager_fetch_type() {
    val myHandler = MyHandler<T>()

    val joinAnnotation = mock<OneToOne> {
        on { this.fetch }.thenReturn(FetchType.EAGER)
        on { (this as java.lang.annotation.Annotation).annotationType() }.thenReturn(OneToOne::class.java)
    }
    val supports = myHandler.supports(joinAnnotation)

    assertThat(supports).isTrue()
}

有替代mock静态方法(PowerMock、MockK)的方法,但我没有测试。

如果有人有更好的建议,我会有兴趣看看。

 类似资料:
  • 是模拟抽象类:,而是接口。这是失败点: 如何模拟这段代码?

  • 我尝试测试一个发送jms消息的类,但无法模拟JmsTemplate JmsProducer.class: JmsProducerTest。类别: 当我运行这个测试用例时,它给了我:java。lang.IllegalArgumentException:对象不是声明类的实例 你对这个问题有什么想法吗?

  • 问题内容: 我正在寻找一种与Mockito进行验证的方法,即在测试过程中与给定的模拟没有任何交互。对于具有验证模式的给定方法,很容易实现这一点,但是我还没有找到完整模拟的解决方案。 我真正想要实现的是:在测试中验证,没有任何内容打印到控制台上。jUnit的总体思路如下: A 有很多方法,我真的不想用单独的验证方法来验证每个方法,而… 因此,我希望,如果有一个简单的解决方案,鉴于我具有良好的测试覆盖

  • 我正在寻找一种方法来验证Mockito,在测试期间没有与给定的模拟进行任何交互。对于具有验证模式的给定方法,很容易实现这一点,但是我还没有找到完整模拟的解决方案。 我真正想要实现的是:在测试中验证,控制台上没有打印任何get。jUnit的总体思路如下: 一个有很多方法,我真的不想用单独的verify来验证每一个方法,对于。。。 所以我希望,如果有一个简单的解决方案,鉴于我有一个良好的测试覆盖率,我

  • 我正在为我的服务层编写单元测试。我的服务层有多个自动生成的字段。我想只模拟其中一个和其他初始化为自动驾驶。 服务接口 服务实现 测试类 我只想嘲笑productRepository字段,但不想嘲笑productManager 问题是productManager 是否可以自动初始化它们?就像它们在运行带有完全加载的上下文的Spring引导应用程序时被初始化一样。

  • 我想测试一个调用对象的类(java中的静态方法调用),但我不能模拟这个对象以避免执行真正的方法。 any()方法来自mockito_kotlin。然后,如果我将一个模拟上下文传递给newIntent方法,则似乎调用了real方法。