有很多方法可以使用MockIto初始化模拟对象。其中最好的方法是什么?
1。
public class SampleBaseTestCase {
@Before public void initMocks() {
MockitoAnnotations.initMocks(this);
}
2。
@RunWith(MockitoJUnitRunner.class)
[编辑] 3。
mock(XXX.class);
如果有其他方法可以建议我…
对于模拟初始化,使用Runner
或是MockitoAnnotations.initMocks
严格等效的解决方案。从MockitoJUnitRunner的javadoc中:
JUnit 4.5 runner initializes mocks annotated with Mock, so that explicit usage of MockitoAnnotations.initMocks(Object) is not necessary. Mocks are initialized before each test method.
MockitoAnnotations.initMocks
当你已经SpringJUnit4ClassRunner
在测试用例上配置了特定的运行器时,可以使用第一个解决方案(带有)。
第二个解决方案(带有MockitoJUnitRunner
)更经典,也是我的最爱。代码更简单。使用转轮提供了很大的优势框架使用的自动验证。
两种解决方案都可以在测试方法之间共享模拟(和间谍)。与结合使用@InjectMocks,它们可以非常快速地编写单元测试。样板代码减少了,测试更易于阅读。例如:
@RunWith(MockitoJUnitRunner.class)
public class ArticleManagerTest {
@Mock private ArticleCalculator calculator;
@Mock(name = "database") private ArticleDatabase dbMock;
@Spy private UserProvider userProvider = new ConsumerUserProvider();
@InjectMocks private ArticleManager manager;
@Test public void shouldDoSomething() {
manager.initiateArticle();
verify(database).addListener(any(ArticleListener.class));
}
@Test public void shouldDoSomethingElse() {
manager.finishArticle();
verify(database).removeListener(any(ArticleListener.class));
}
}
优点:代码很少
缺点:黑魔法。IMO这主要是由于@InjectMocks注释。有了这个注释, “你可以放松代码的痛苦”(请参阅@Brice的精彩评论)
第三种解决方案是在每个测试方法上创建模拟。正如@mlk在其答案中所解释的,它允许进行“ 自包含测试 ”。
public class ArticleManagerTest {
@Test public void shouldDoSomething() {
// given
ArticleCalculator calculator = mock(ArticleCalculator.class);
ArticleDatabase database = mock(ArticleDatabase.class);
UserProvider userProvider = spy(new ConsumerUserProvider());
ArticleManager manager = new ArticleManager(calculator,
userProvider,
database);
// when
manager.initiateArticle();
// then
verify(database).addListener(any(ArticleListener.class));
}
@Test public void shouldDoSomethingElse() {
// given
ArticleCalculator calculator = mock(ArticleCalculator.class);
ArticleDatabase database = mock(ArticleDatabase.class);
UserProvider userProvider = spy(new ConsumerUserProvider());
ArticleManager manager = new ArticleManager(calculator,
userProvider,
database);
// when
manager.finishArticle();
// then
verify(database).removeListener(any(ArticleListener.class));
}
}
优点:你可以清楚地演示api的工作原理(BDD …)
缺点:还有更多样板代码。(模拟创作)
我的建议是妥协。将@Mock
注释与一起使用@RunWith(MockitoJUnitRunner.class)
,但不要使用@InjectMocks
:
@RunWith(MockitoJUnitRunner.class)
public class ArticleManagerTest {
@Mock private ArticleCalculator calculator;
@Mock private ArticleDatabase database;
@Spy private UserProvider userProvider = new ConsumerUserProvider();
@Test public void shouldDoSomething() {
// given
ArticleManager manager = new ArticleManager(calculator,
userProvider,
database);
// when
manager.initiateArticle();
// then
verify(database).addListener(any(ArticleListener.class));
}
@Test public void shouldDoSomethingElse() {
// given
ArticleManager manager = new ArticleManager(calculator,
userProvider,
database);
// when
manager.finishArticle();
// then
verify(database).removeListener(any(ArticleListener.class));
}
}
优点:你可以清楚地演示api的工作原理(如何ArticleManager实例化my )。没有样板代码。
缺点:测试不是独立的,代码痛苦更少
有许多方法可以使用mockito初始化模拟对象。其中什么是最好的方法? 1. 建议我有没有比这些更好的方法...
问题内容: 我在用Java工作。 我通常会这样设置一些对象: 问题是:在此示例中是否等于,按原样我可以假定对未初始化的对象进行空检查将是准确的? 问题答案: 正确,未显式初始化的引用类型的静态成员和实例成员都由Java 设置为。相同的规则适用于数组成员。 根据Java语言规范的第4.12.5节: 变量的初始值 程序中的每个变量在使用值之前都必须具有一个值: 每个类变量,实例变量或数组组件在创建时均
问题内容: 我想问一下Java初始化的格式。 我目前所知道的是: 等等 现在,在main类中,我想初始化一个,我不知道该怎么做? 问题答案: 首先,文件是对象类型,与int和double不同,它们是原始类型。我不确定您对Java有多熟悉,但是要创建一个对象,请使用该对象的构造函数。 File具有一个构造函数,该构造函数接收该文件在计算机上的位置字符串。
前面一节的 Fruit 类有两个实变量,分别表述水果的类型和状态.直到为这个类写了一个定制的inspect方法,我们方才了解它不会对一个缺乏属性的水果做出合理的解释.幸运的是,Ruby提供了一种允许实变量总是被初始化的方法. initalize方法 当Ruby创建一个新对象时,它总是会寻找一个名为 initialize 的方法并执行它.因此,我们可以简单通过一个initialize方法向实变量中加
我想使用“=”符号初始化MyClass的对象。 例如。字符串a=“你好”; 我想做 这是我用构造函数写的类