ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 手动实例化@InjectMock带注释的字段

2019-05-28 04:48:43  阅读:361  来源: 互联网

标签:java unit-testing junit mocking mockito


我已经浏览了一些博客,以了解Mockito注释如何工作的基础知识.

但是,我怀疑何时可以手动实例化用@InjectMocks注释的字段,即

@InjectMocks
A a = new A();

什么时候依靠MockitoAnnotations.initMocks()功能来做同样的事情:

@InjectMocks
A a;

这取决于我们用来运行测试用例的JunitTestRunner还是依赖于Mockito框架版本?

解决方法:

这取决于你是否正在使用(声明)跑步者.

如果你使用跑步者,你不需要自己调用MockitoAnnotations.initMocks() – 跑步者会为你调用它.

通常我们会选择跑步者.但是当你想要使用其他跑步者时(比如Spring),你可以自己调用.initMocks().

为了清楚起见,MockitoAnnotations.initMocks(this)将:

>实例化使用@InjectMocks注释的字段
>创建使用@Mock注释的每个字段的模拟版本
>在@InjectMocks变量的字段中注入@Mocks(或调用其构造函数或使用其setter – 它取决于您使用的依赖注入类型)

Mockito运行器,initMocks和规则代码示例

下面的三个代码示例应该是等效的.

有跑者:

第一个片段使用了转轮,无需调用initMocks().

@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {

    @Mock private MyDependency myDependency;
    @InjectMocks private MyClass myClass;

    @Test
    public void myClass_should_get_stuff_from_dependency() {
        when(myDependency.getStuff()).thenReturn("stuff!");

        assertThat(myClass.getDependencyStuff(), is("stuff!"));
    }
}

没有跑步者手动调用.initMocks():

另一个不使用runner,因此需要setUp()方法调用我们的initMocks()朋友.

// notice there is no runner
public class MyClassTest {

    @Mock private MyDependency myDependency;
    @InjectMocks private MyClass myClass;

    // but now you have to call initMocks() yourself
    @Before
    public void setUp() throws Exception {
          MockitoAnnotations.initMocks(this);
    }

    @Test
    public void myClass_should_get_stuff_from_dependency() {
        when(myDependency.getStuff()).thenReturn("stuff!");

        assertThat(myClass.getDependencyStuff(), is("stuff!"));
    }
}

没有跑步者或手动呼叫,使用@Rule:

最后,正如comments (thanks @StefanBirkner)中所指出的那样,自版本1.10.17起,还有可能使用名为MockitoRuleJUnit @Rule

public class MyClassTest {

    @Rule
    public MockitoRule rule = MockitoJUnit.rule();

    @Mock private MyDependency myDependency;
    @InjectMocks private MyClass myClass;

    @Test
    public void myClass_should_get_stuff_from_dependency() {
        when(myDependency.getStuff()).thenReturn("stuff!");

        assertThat(myClass.getDependencyStuff(), is("stuff!"));
    }
}

标签:java,unit-testing,junit,mocking,mockito
来源: https://codeday.me/bug/20190528/1168708.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有