我正在使用项目中的弹簧框架使用Mockito。
我有这样的测试用例:
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_DEFAULT
或Answers.RETURNS_MOCKS
。
我可以强制使用MyAnswer
使用@Mock
注释的dao
吗?
不幸的是,您必须使用Mockito.mock
。当前无法指定您通过@Mock编写的答案。
原因与Mockito无关,与Java的注释规格有关:
参数只能以原始,字符串,类,枚举,注释或其中任何一个数组的形式键入。(Jason Hunter,"充分利用Java的元数据,第2部分:自定义注释"
和Java语言规范§9.6.1:
在注释类型中声明的方法的返回类型必须是以下一个,或者发生编译时间错误:
- 原始类型
- 字符串
- 班级或类(第4.5款)的调用
- 枚举类型
- 注释类型
- 一个数组类型的组件类型是前面类型之一(§10.1)。
由于注释类型元素必须有效地是VM范围的常数(包括枚举值,但不包括任意实例),因此无法放置您创建的答案实例。从理论上讲,Mockito可以让您指定一个命名的答案子类,但随后Mockito也将负责实例化,这并不总是可能并导致运行时失败。如果该功能对您来说很重要,则可以考虑提出功能请求。