这次,我想对测试框架Mockito进行概述。 毫无疑问,这是用于测试Java代码的最受欢迎的工具之一。 我已经对Mockito的竞争对手EasyMock进行了概述。 这篇文章将基于有关EasyMock的示例应用程序。 我的意思是代表咖啡机功能的类。
用Mockito准备测试
通常,我将使用Maven进行项目设置。 因此,要使Mockito在项目中可用,我需要在pom.xml文件中添加以下依赖项:
<dependencies>
<dependency>
<groupid>org.mockito</groupid>
<artifactid>mockito-all</artifactid>
<version>1.9.5</version>
</dependency>
<dependency>
<groupid>junit</groupid>
<artifactid>junit</artifactid>
<version>4.11</version>
</dependency>
</dependencies>
请注意,Mockito的正常功能不需要JUnit,可以用相同的方法使用TestNG来代替它。 因此,您可以根据自己的决定使用JUnit或TestNG。
让我们进一步。 如前所述,本文中的所有测试都是针对EasyMock帖子中的示例应用程序编写的。 您可以从此处仅阅读“应用程序代码”部分。 这足以了解测试的主题。
Mockito和JUnit测试
我想从关于Mockito框架的几句话开始本节。 毫无疑问,借助Mockito,您可以完成测试中希望做的所有事情。 您可以在清除API的帮助下创建模拟,存根,进行验证以及所有这些操作。
现在该看看使用Mockito进行单元测试的样子了。
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import com.app.data.Portion;
import com.app.exceptions.NotEnoughException;
import com.app.mechanism.CoffeeMachine;
import com.app.mechanism.interfaces.ICoffeeMachine;
import com.app.mechanism.interfaces.IContainer;
@RunWith(MockitoJUnitRunner.class)
public class CoffeeMachineTest {
ICoffeeMachine coffeeMachine;
@Mock
IContainer coffeeContainer;
@Mock
IContainer waterContainer;
@Before
public void setUp() {
coffeeMachine = new CoffeeMachine(coffeeContainer, waterContainer);
}
@After
public void tearDown() {
coffeeContainer = null;
waterContainer = null;
coffeeMachine = null;
}
@Test
public void testMakeCoffe() throws NotEnoughException {
when(coffeeContainer.getPortion(Portion.LARGE)).thenReturn(true);
when(waterContainer.getPortion(Portion.LARGE)).thenReturn(true);
assertTrue(coffeeMachine.makeCoffee(Portion.LARGE));
}
@Test
public void testNotEnoughException() throws NotEnoughException {
when(coffeeContainer.getPortion(Portion.SMALL)).thenReturn(false);
when(waterContainer.getPortion(Portion.SMALL)).thenReturn(true);
assertFalse(coffeeMachine.makeCoffee(Portion.SMALL));
}
}
我将用几句话解释一下测试班里发生了什么。 我正在测试咖啡机,为此,我为咖啡容器和水容器创建了模拟。 进一步在测试中,我将为模拟定义一些行为,并根据这台咖啡机执行预期的操作。
...
@Mock
IContainer coffeeContainer;
@Mock
IContainer waterContainer;
...
在上面的代码中,我声明了两个模拟。 以这种方式创建模拟需要将@RunWith(MockitoJUnitRunner.class)批注应用于测试类。 或者,您可以使用MockitoAnnotations.initMocks(testClass); 在运行任何测试之前,例如,您可以将此代码段放入@Before注释的方法中。
...
when(coffeeContainer.getPortion(Portion.LARGE)).thenReturn(true);
...
在Mockito中定义模拟的行为非常方便。 您可以指定在调用特定方法后应返回的内容。 注意,我在测试类中进行了几次静态导入 。
摘要
Mockito框架征服了我的心。 这非常方便,其API清晰,使用简便。 Mockito包含许多在单元测试开发过程中可能需要的方法。 当然,一篇文章太小而无法描述Mockito的所有功能,因此我建议您使用官方文档的跟随链接进行更深入的研究。
参考: Fruzenshtein的便笺博客中来自JCG合作伙伴 Alexey Zvolinskiy的JUnit和Mockito合作 。
翻译自: https://www.javacodegeeks.com/2013/05/junit-and-mockito-cooperation.html