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

Java Mockito.mock(SomeClass)和@mock注释之间有什么区别?,java,unit-testing,junit,mocking,mockito,Java,Unit Testing,Junit,Mocking,Mockito,Mockito.mock(Class classToMock)方法和@mock注释之间有什么区别? 它们是一样的吗 例如,这是: private TestClass test = Mockito.mock(TestClass.class); 同: @Mock private TestClass test; 区别在于您需要编写的代码行:):) 不过,说真的,使用注释与使用Mockito.mock具有完全相同的效果 引用MockitoAnnotations的文档,使用注释有以下好处: 允许速记

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

例如,这是:

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

@Mock
private TestClass test;

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

不过,说真的,使用注释与使用Mockito.mock具有完全相同的效果

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

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

  • 最小化重复的模拟创建代码

  • 使测试类更具可读性

  • 由于字段名为
    用于识别模拟对象


MockitoAnnotations
的javadoc是

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


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

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

@Mock是一种注释,它:

  • 最小化重复的模拟创建代码
  • 使测试类更具可读性
  • 允许速记创建测试所需的对象

使用注释有两个显著的优点

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

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

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

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

一切按预期开始工作。因此Mockito.mock正在测试方法之间创建一个共享的mock,而@mock没有

@ExtendWith(MockitoExtension.class)

不要忘记@InjectMock,也不要忘记错误消息中的模拟名称。所以这两种方法的效果并不完全相同。我觉得说速记很奇怪。是的,它需要更少的字符,但需要更多的行。在软件开发速记的上下文中,我总是将速记解释为我必须编写更少的代码:)@RogerSwernerson-您可以将注释放在同一行上,注释不需要以下换行符。这是错误的。如果使用
@Mock
,则必须在
@Before
中使用
MockitoAnnotations.initmock(this)
,这相当于在
@Before
设置方法中只编写
Mockito.Mock(Some.class)
。(然后在每次测试之前重新创建模拟,您描述的问题就会消失)它可能会消失,但这是一个主要区别。如果您使用JUnit,则情况并非如此,它“在执行每个测试方法之前创建每个测试类的新实例”-每种方法都有优点和缺点:
@ExtendWith(MockitoExtension.class)