这次,我想对测试框架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