使用 MockIto 初始化模拟对象的方法有很多种。其中最好的方法是什么?
1.
public class SampleBaseTestCase {
@Before public void initMocks() {
MockitoAnnotations.initMocks(this);
}
@RunWith(MockitoJUnitRunner.class)
mock(XXX.class);
建议我是否有比这些更好的其他方法……
原文由 Vinay Veluri 发布,翻译遵循 CC BY-SA 4.0 许可协议
对于模拟初始化,使用 runner 或
MockitoAnnotations.initMocks
是严格等效的解决方案。来自 MockitoJUnitRunner 的 javadoc:当您已经在测试用例上配置了特定的运行器(例如
SpringJUnit4ClassRunner
)时,可以使用第一个解决方案(使用MockitoAnnotations.initMocks
)。第二种解决方案(带有
MockitoJUnitRunner
)更经典,也是我最喜欢的。代码更简单。使用运行器提供了 框架使用自动验证 的巨大优势( @David Wallace 在 这个答案 中描述)。这两种解决方案都允许在测试方法之间共享模拟(和间谍)。加上
@InjectMocks
,它们允许非常快速地编写单元测试。样板模拟代码减少了,测试更容易阅读。例如:优点:代码最少
缺点:黑魔法。 IMO 这主要是由于 @InjectMocks 注释。有了这个注释 “你就摆脱了代码的痛苦” (见 @Brice 的精彩评论)
第三种解决方案是在每个测试方法上创建您的模拟。正如 @mlk 在其答案中所解释的那样,它允许进行“ _自包含测试_”。
优点:你清楚地展示了你的 api 是如何工作的(BDD …)
缺点:有更多样板代码。 (模拟创作)
我 的建议是妥协。将
@Mock
注释与@RunWith(MockitoJUnitRunner.class)
一起使用,但不要使用@InjectMocks
:优点:你清楚地展示了你的 api 是如何工作的(我的
ArticleManager
是如何实例化的)。没有样板代码。缺点:测试不是独立的,减少了代码的痛苦