为了账号安全,请及时绑定邮箱和手机立即绑定

初始化模拟对象-MockIto

初始化模拟对象-MockIto

MYYA 2019-11-11 15:55:23
有很多方法可以使用MockIto初始化模拟对象。其中最好的方法是什么?1。 public class SampleBaseTestCase {   @Before public void initMocks() {       MockitoAnnotations.initMocks(this);   }2。@RunWith(MockitoJUnitRunner.class)[编辑] 3。mock(XXX.class);建议我是否还有其他比这些更好的方法...
查看完整描述

3 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

现在(从v1.10.7开始),有第四种实例化模拟的方法,它使用了一个称为MockitoRule的JUnit4 规则。


@RunWith(JUnit4.class)   // or a different runner of your choice

public class YourTest

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

  @Mock public YourMock yourMock;


  @Test public void yourTestMethod() { /* ... */ }

}

JUnit查找以@Rule注释的TestRule的子类,并使用它们包装Runner提供的测试语句。这样的结果是您可以提取@Before方法,@ After方法,甚至尝试...将包装器捕获到规则中。您甚至可以在您的测试中与这些交互,就像ExpectedException一样。


MockitoRule的行为几乎与MockitoJUnitRunner完全一样,除了可以使用任何其他运行程序,例如Parameterized(允许测试构造函数接受参数,以便测试可以多次运行)或Robolectric的测试运行程序(因此其类加载器可以提供Java替换)适用于Android本机类)。这使得在最新的JUnit和Mockito版本中使用时更加灵活。


综上所述:


Mockito.mock():直接调用,没有注释支持或使用验证。

MockitoAnnotations.initMocks(this):支持注释,无使用验证。

MockitoJUnitRunner:注释支持和使用验证,但是您必须使用该运行器。

MockitoRule:任何JUnit运行器都支持注释和使用验证。


查看完整回答
反对 回复 2019-11-11
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

有一种整齐的方法可以做到这一点。


如果是单元测试,则可以执行以下操作:


@RunWith(MockitoJUnitRunner.class)

public class MyUnitTest {


    @Mock

    private MyFirstMock myFirstMock;


    @Mock

    private MySecondMock mySecondMock;


    @Spy

    private MySpiedClass mySpiedClass = new MySpiedClass();


    // It's gonna inject the 2 mocks and the spied object per reflection to this object

    // The java doc of @InjectMocks explains it really well how and when it does the injection

    @InjectMocks

    private MyClassToTest myClassToTest;


    @Test

    public void testSomething() {

    }

}

编辑:如果这是一个集成测试,则可以执行此操作(不打算与Spring一起使用。仅演示您可以使用不同的Runners初始化模拟):


@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration("aplicationContext.xml")

public class MyIntegrationTest {


    @Mock

    private MyFirstMock myFirstMock;


    @Mock

    private MySecondMock mySecondMock;


    @Spy

    private MySpiedClass mySpiedClass = new MySpiedClass();


    // It's gonna inject the 2 mocks and the spied object per reflection to this object

    // The java doc of @InjectMocks explains it really well how and when it does the injection

    @InjectMocks

    private MyClassToTest myClassToTest;


    @Before

    public void setUp() throws Exception {

          MockitoAnnotations.initMocks(this);

    }


    @Test

    public void testSomething() {

    }

}


查看完整回答
反对 回复 2019-11-11
  • 3 回答
  • 0 关注
  • 577 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信