【发布时间】:2016-12-10 19:31:43
【问题描述】:
我只是对此感到困惑(Mockito 1.10):
@Rule
public MockitoRule rule = MockitoJUnit.rule();
@Mock
private Collection<IndexableField> mockedFieldsFromRetrievedDocument;
@Spy
@InjectMocks
private IndexManager injectedSpyIM = new IndexManager();
@Test
public void numberOfLDocsShouldBePrintedOutWithEachHitLine() throws Exception{
LOGGER.info( String.format( "# A: %d", mockedFieldsFromRetrievedDocument.hashCode() ));
LOGGER.info( String.format( "# fFRD %s", injectedSpyIM.getFFRD() ));
很自然,IndexManager中有一个方法getFFRD,它返回私有字段
private Collection<IndexableField> fieldsFromRetrievedDocument;
IndexManager中还有另一个私有字段:
private Collection<Closeable> closeableComponents;
记录的第一行为您提供了一个有效的哈希码。
最后一行显示
#fFRD 为空
当我检查closeableComponents的值时,我发现它的哈希码确实是注入的模拟Collection的哈希码。
然后我尝试交换IndexManager 中这些字段声明的位置:没有变化。
这里的@Mock 行似乎是 1) 完全忽略了泛型类和 2) 由于我不明白的原因,优先使用 Collection<Closeable> 而不是另一个...
稍后
哇,疯狂的东西:我刚刚将字段名称 closeableComponents 更改为 xcloseableComponents。现在模拟的字段确实在做我想做的事,即模拟字段fieldsFromRetrievedDocument。
我的临时结论自然是,Mockito 使用它找到的第一个类型为Collection<anything> 的字段名称......按字母顺序排列!大概相同的选择过程适用于存在多个“相同”类型的字段的其他情况。只是在谷歌上搜索但没有成功:有人知道这是否记录在某处吗?
稍后
按照 Jeff Bowman 的建议,我更改了如下内容:
@Mock(name="fieldsFromRetrievedDocument")
private Collection<?> mockedFieldsFromRetrievedDocument;
...这是类中字段的准确拼写,大小写正确。但它仍然注入了错误的Collection<?> 作为模拟。那么……
我从 Mockito 1.10 更改为最新的 2.3.0:问题解决了!一个警示故事,name 属性在 1.10 的 Javadoc API 中有完整的文档...!
【问题讨论】:
标签: java dependency-injection mocking mockito