【问题标题】:@mock annotation with custom Answer class in Mockito在 Mockito 中使用自定义 Answer 类的 @mock 注释
【发布时间】:2017-02-23 18:30:15
【问题描述】:

我在我的项目中使用 Mockito 和 Spring Framework。

我有一个这样的测试用例:

class SomeTest {
    @Mock
    SomeDao dao; 

    @InjectMock
    TestTarget target;

    class MyAnswer implements Answer {
       //some method here
    }
}

我想为dao 定义一个自定义答案类MyAnswer

如果没有注释,我可以使用 Mockito.mock(Dao.class, new MyAnswer()) 来强制使用 MyAnswer 模拟对象。但我发现使用@Mock 注释,它们只接受enum Answers 内部的参数,如Answers.RETURNS_DEFAULTAnswers.RETURNS_MOCKS

我可以强制daoMyAnswer 一起使用@Mock 注释吗?

【问题讨论】:

    标签: java spring unit-testing mockito


    【解决方案1】:

    很遗憾,您必须为此使用Mockito.mock。目前无法指定您通过@Mock 编写的答案。

    原因与 Mockito 无关,而与 Java 的注解规范有关:

    参数只能作为原始类型、字符串、类、枚举、注释或任何这些类型的数组。 (杰森·亨特,"Making the Most of Java's Metadata, Part 2: Custom Annotations"

    Java Language Specification §9.6.1:

    注解类型中声明的方法的返回类型必须是以下之一,否则会发生编译时错误:

    • 原始类型
    • 字符串
    • 类或类的调用(§4.5)
    • 枚举类型
    • 注释类型
    • 一种数组类型,其组件类型是上述类型之一 (§10.1)。

    因为注释类型元素必须是有效的 VM 范围的常量(包括枚举值但不包括任意实例),所以无法放置您创建的答案实例。从理论上讲,Mockito 可以让您指定一个命名的 Answer子类,但是 Mockito 也将负责实例化它,这并不总是可能的,并且会导致运行时失败。如果该功能对您很重要,您可以考虑发送feature request

    【讨论】:

    • 感谢您的帮助。它正好帮助我理解 Java 中的注释逻辑 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多