【问题标题】:What is the difference between Mockito.mock(SomeClass) and the @Mock annotation?Mockito.mock(SomeClass) 和 @Mock 注释有什么区别?
【发布时间】:2014-06-27 03:14:04
【问题描述】:

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

例如,是这样的:

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

同:

@Mock
private TestClass test;

【问题讨论】:

标签: java unit-testing junit mocking mockito


【解决方案1】:

它们都达到了相同的结果。使用注释 (@Mock) 通常被认为是“更干净”,因为您不会用看起来都一样的样板赋值来填充代码。

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

【讨论】:

  • 别忘了@InjectMocks
  • 不要忘记错误消息中的模拟名称。所以两者并没有相当达到相同的结果。
【解决方案2】:

不同之处在于您需要编写的代码行:) :) :)

说真的,使用注释与使用 Mockito.mock 的效果完全相同。

引用MockitoAnnotations的文档,使用注解有以下好处:

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

  • 最大限度地减少重复的模拟创建代码。

  • 使测试类更具可读性。

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

MockitoAnnotations 的 javadoc 是 here

【讨论】:

  • 我觉得简写很奇怪。是的,它需要更少的字符,但需要更多的行。
  • 在软件开发速记的上下文中,我一直将速记解释为意味着我必须编写更少的代码:)
  • @RogerCSWernersson - 您可以将注释放在同一行,注释不需要后面的换行符。
【解决方案3】:

它们都被认为是相同的并且实现了相同的目标,但我更喜欢第二个:

@Mock 是一个注解:

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

【讨论】:

    【解决方案4】:

    使用注释有两个显着优势。

    • 可以使用@InjectMocks 注释将使用@Mock 创建的模拟注入到您正在测试的类中。这是一种强大的技术,可以显着简化测试。它只是不适用于mock 方法创建的模拟。
    • 如果您的模拟有任何错误,模拟的名称将出现在消息中。如果您使用过@Mock,那么此名称将只是该字段的名称。这使得很容易找到问题模拟。

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

    【讨论】:

      【解决方案5】:

      这个问题的答案是一个大错误。 我们刚刚解决了 Mockito.mock(Your.class) 作为字段引起的一些问题。 我们几乎没有@Test 方法。第四种方法是使用“thenThrow(ex)”引发异常。失败后的所有@Test 方法,原因是抛出异常。他们正在共享模拟实例和“何时”条件。我们从

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

      @Mock
      TestClass testInstance;
      

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

      【讨论】:

      • 这是不正确的。如果你使用@Mock,那么你必须在@Before中使用MockitoAnnotations.initMocks(this),这相当于在相同的@Before设置方法中只写Mockito.mock(Some.class)。 (然后在每次测试之前重新创建模拟,您描述的问题就消失了)
      • 它可能会消失,但这是主要区别。
      • 如果您使用的是 JUnit,这不是真的,它“在执行每个测试方法之前创建每个测试类的新实例” - junit.org/junit5/docs/current/user-guide/…
      【解决方案6】:

      在 Junit5 中,使用

      @ExtendWith(MockitoExtension.class)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-27
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 2022-01-21
        • 2012-11-10
        • 2019-01-25
        • 1970-01-01
        相关资源
        最近更新 更多