Mockito.mock(SomeClass)和@Mock注释有什么区别?

时间:2014-05-09 11:36:28

标签: java unit-testing junit mocking mockito

Mockito.mock(Class<T> classToMock)方法和@Mock注释之间有什么区别? 它们是一样的吗?

例如,是这样的:

private TestClass test = Mockito.mock(TestClass.class);

与:

相同
@Mock
private TestClass test;

6 个答案:

答案 0 :(得分:57)

他们都取得了相同的结果。使用注释(@Mock)通常被认为是“更清晰”,因为您没有使用看起来相同的样板分配来填充代码。

请注意,要使用@Mock注释,您的测试类应使用@RunWith(MockitoJUnitRunner.class)进行注释,或在MockitoAnnotations.initMocks(this)方法中包含对@Before的调用。

答案 1 :(得分:8)

区别在于您需要编写的代码行:) :) :)

严重的是,使用注释与使用Mockito.mock具有完全相同的效果。

引用MockitoAnnotations的文档时,注释的使用具有以下好处:

  • 允许速记创建测试所需的对象。

  • 尽量减少重复的模拟创建代码。

  • 使测试类更具可读性。

  • 因为字段名称为
    ,因此更容易阅读验证错误 用于识别模拟。

MockitoAnnotations的javadoc为here

答案 2 :(得分:4)

他们都被认为是相同的并且达到了同样的目的,但我更喜欢第二个:

@Mock是一个注释:

  • 尽量减少重复的模拟创建代码。
  • 使测试类更具可读性。
  • 允许速记创建测试所需的对象。

答案 3 :(得分:3)

使用注释有两个显着的优点。

  • 使用@Mock注释,可以将使用@InjectMocks创建的模拟注入到您正在测试的类中。这是一种强大的技术,可以使测试变得更加容易。它只适用于mock方法创建的模拟。
  • 如果您有涉及模拟的任何错误,模拟的名称将显示在消息中。如果您使用了@Mock,则此名称将只是该字段的名称。这使得很容易找到问题模拟。

当然,除了这两个重要优点之外,大多数人发现@Mock符号更具可读性,并且确实减少了代码量。我认为没有理由不使用它。

答案 4 :(得分:0)

问题的答案是一个大错误。 我们刚刚解决了Mockito.mock(Your.class)引起的一些问题。 我们的@Test方法很少。第四种方法是使用&#39; thenThrow(ex)&#39;抛出异常。它失败后的所有@Test方法,原因是抛出异常。他们分享了被模拟的实例和“#&条件。我们改变了

之后
TestClass testInstance = Mockito.mock(TestClass.class);

@Mock
TestClass testInstance;
一切都开始按预期工作了。所以Mockito.mock正在测试方法之间创建一个共享模拟,而@Mock则没有。

答案 5 :(得分:0)

在Junit5中使用

@ExtendWith(MockitoExtension.class)