Mockito 中带有自定义 Answer 类的 @mock 注释

Liy*_*uan 4 java spring unit-testing mockito

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

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

class SomeTest {
    @Mock
    SomeDao dao; 

    @InjectMock
    TestTarget target;

    class MyAnswer implements Answer {
       //some method here
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

我可以强制dao使用MyAnswer注释@Mock吗?

Jef*_*ica 5

不幸的是不是\xe2\x80\x94你必须使用Mockito.mock。目前无法指定您通过@Mock 编写的答案。

\n

原因与 Mockito 关系不大,而与 Java 的注释规范有关:

\n
\n

参数只能输入为原语、字符串、类、枚举、注释或其中任何一个的数组。(Jason Hunter,“充分利用 Java 元数据,第 2 部分:自定义注释”)

\n
\n

在Java 语言规范 \xc2\xa79.6.1中:

\n
\n

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

\n
    \n
  • 原始类型
  • \n
  • 细绳
  • \n
  • 类或类的调用 (\xc2\xa74.5)
  • \n
  • 枚举类型
  • \n
  • 注释类型
  • \n
  • 其组件类型为上述类型之一的数组类型 (\xc2\xa710.1)。
  • \n
\n
\n

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

\n