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
方法创建的mockmock
- 如果您有任何涉及模拟的错误,则消息中将显示模拟的名称。如果您使用了
,则此名称将只是字段的名称。这使得找到问题变得非常容易李>@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)