Java Mockito-什么规则控制类似集合类的mock的注入?

Java Mockito-什么规则控制类似集合类的mock的注入?,java,dependency-injection,mocking,mockito,Java,Dependency Injection,Mocking,Mockito,我只是对此感到困惑(Mockito 1.10): IndexManager中还有另一个私有字段: private Collection<Closeable> closeableComponents; 。。。这是类中字段的准确拼写,大小写正确。但它仍然注入了错误的集合作为模拟。然后 我从Mockito 1.10改为最新的2.3.0:问题解决了!这是一个值得警惕的故事,name属性在1.10的JavaDocAPI中有完整的文档记录 描述的行为可能不像您希望的那样记录在案或具有确定性:

我只是对此感到困惑(Mockito 1.10):

IndexManager
中还有另一个私有字段:

private Collection<Closeable> closeableComponents;
。。。这是类中字段的准确拼写,大小写正确。但它仍然注入了错误的
集合作为模拟。然后

我从Mockito 1.10改为最新的2.3.0:问题解决了!这是一个值得警惕的故事,
name
属性在1.10的JavaDocAPI中有完整的文档记录

描述的行为可能不像您希望的那样记录在案或具有确定性:

属性设置器注入;mock将首先按类型解析(如果无论名称如何,都会发生单个类型匹配注入),然后,如果有多个相同类型的属性,则通过属性名称和mock名称的匹配来解析

注意1:如果您有相同类型(或相同擦除)的属性,最好使用匹配的属性命名所有@Mock注释字段,否则Mockito可能会混淆,不会发生注入

这是有意义的,因为字段的泛型类型被删除了——在运行时不可读——并且因为Java的反射方法
getDeclaredFields
getDeclaredMethods
被返回。匹配的名称是首选的,其他一切都是未定义的行为,您的重命名操作恰好对您有利;不要指望那种行为


上面命名mock的概念是指在上使用
name
属性。

再次感谢。接下来,我尝试将测试类命名为与CUT中的实际字段相同的名称。我不认为这会起作用。。。我是对的!但是现在我知道
@Mock
注释有一个可选的“name”属性,我需要处理它。您可能会认为,面对两个相同类型的字段,它们的实际名称可以与剪切字段的名称进行比较。。。由于正在使用反射,如果
“mockedFoo”.containsIgnoringCase(“foo”)
,则假定
mockedFoo
代表
foo
,没有任何歧义。似乎不是!PS思想#2:通过反射获得泛型:这里有一些想法:。莫基托就不能试一下sthg吗?@mike请仔细阅读“这件事做不到”是如何回答这个问题的正确答案。你能得到的最接近的结果(这是大多数答案所指的)是,对于
类B扩展了A
新A(){}
,你可以从类型层次结构中反射地得到A和T。有一种方法可以获得泛型类型信息,但是记住类型变量,你要求Mockito变得非常聪明,以牺牲测试可读性和框架清晰性为代价。那么这些东西在测试可读性和框架清晰性方面的成本是多少?我向你们在这些问题上的高明理解低头,并假设Mockito为我们提供了足够的工具,以满足我们可能从mocking框架中合理需要的东西。。。(注意,作为一名完全的新手,我记得最近读到过关于PowerMock的质疑,例如,提供“太多的魔法”…)
private Collection<IndexableField> fieldsFromRetrievedDocument;
private Collection<Closeable> closeableComponents;
@Mock(name="fieldsFromRetrievedDocument")
private Collection<?> mockedFieldsFromRetrievedDocument;