Mockito @InjectMocks不适用于相同类型的字段

奥列格·查尔·察尔科(Oleg Tsal-Tsalko):

我很惊讶地发现以下简单代码示例不适用于所有> 1.8.5的Mockito版本

@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {

    @Mock(name = "b2")
    private B b2;

    @InjectMocks
    private A a;

    @Test
    public void testInjection() throws Exception {
        assertNotNull(a.b2); //fails
        assertNull(a.b1); //also fails, because unexpectedly b2 mock gets injected here
    }

    static class A{
        private B b1;
        private B b2;
    }

    interface B{}
}

在javadocs(http://docs.mockito.googlecode.com/hg/latest/org/mockito/InjectMocks.html)中有一个引号:

注意1:如果您具有相同类型(或相同擦除)的字段,则最好用匹配的字段来命名所有@Mock注释的字段,否则Mockito可能会造成混淆,并且不会进行注入。

这是否意味着如果我有几个具有相同类型的字段,我就不能只模拟其中一个,而应该@Mock所有具有相同类型的字段定义它是已知的限制吗,还有什么原因为什么还没有解决?@Mock按字段名称匹配应该很简单,不是吗?

蒂姆·范德利普:

Mockito似乎使用了JavaDoc中描述的算法

如果我理解正确,它将首先对类型进行排序(在这种情况下仅为1 B),然后对名称进行排序(此处无更改)。最终它将使用OngoingInjector接口实现进行注入,该实现似乎是搜索第一个字段并将其注入。

由于您仅定义了1个B,并且在Mock中有2个B字段,因此它将看到第一个实例与该字段的匹配并停止。这是因为mocks.size() == 1NameBasedCandidateFilter中因此它将停止过滤并直接注入。如果创建相同类型的多个模拟,它们将按Name排序并相应注入。

当创建特定类型的多个模拟(但少于字段数)时,我能够使它工作。

@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {

    @Mock(name = "b2")
    private B b2;

    @Mock(name = "b3")
    private B b3;

    @InjectMocks
    private A a;

    @Test
    public void testInjection() {
        System.out.println(this.a);
    }

    static class A {

        private B b1;

        private B b2;

        private B b3;
    }

    interface B {
    }
}

这将正确地将b2注入a.b2并将b3注入a.b3,而不是a.b1和a.b2(在A中定义的前两个字段)。

您可以随时将GitHub问题保留在其存储库中,以增强或更改注入过滤算法,以便进行查看。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Mockito @Spy 在相同类型的字段上

Mockito嘲笑不适用于主要方法java

Mockito错误不适用于该参数(无效)

gradle中的mockito不适用于java项目

Java泛型-方法不适用于Mockito生成的存根

Mockito returnFirstArg()不适用于通用的第一个arg

Mockito when and thenReturn语句不适用于Java中的2个方法调用

Mockito验证不适用于序列化/反序列化的模拟

Mockito测试不适用于提交者的Eclipse 4.9

Mockito.do没有什么不适用于处理程序

Mockito:使用@InjectMocks时模拟被测试方法调用的相同类的方法

Mockito匹配原始类型

next()。focus()仅适用于相同类型的控件

联接不适用于两个相同的字段

React Link不适用于相同的URL类型dom

Mockito,@ InjectMocks具有最终字段的奇怪行为

按日期排序不适用于“日期类型”字段

Elasticsearch聚合不适用于嵌套类型字段

适用于Android Instrumentation测试的Mockito 2:无法初始化插件:接口org.mockito.plugins.MockMaker

Mockito thenReturn返回相同的实例

Mockito ArgumentCaptor用于Kotlin函数

Spring Boot @Autowired by General不适用于@InjectMocks

Mockito无法模拟原始类型

Mockito模拟when()用于不同类型的两个泛型方法

EasyMock和Unitils等效于Mockito @ InjectMocks

Spring Mockito @injectmocks无法正常工作

append()中的“ ...”符号不适用于追加不同类型的切片

为什么具有不同类型元素的集合不适用于迭代?

焦点不适用于输入字段