个性化阅读
专注于IT技术分析

Eclipse IDE中Mockito和JUnit的示例

本文概述

在这里, 我们将结合使用Mockito框架和JUnit框架。我们也可以使用Spring Boot代替JUnit框架。

JUnit是Java程序员用于创建测试用例的测试框架之一。与Mockito一样, JUnit也是一个开放源代码测试框架。要深入了解JUnit框架的概念, 请单击给定的链接https://www.srcmini02.com/junit-tutorial。

1.存根示例

在此示例中, 我们将使用存根测试一个简单的模块。以下是创建测试示例的步骤:

目录结构

Eclipse IDE中Mockito和JUnit的示例

步骤1:添加应用程序所需的Maven依赖项。依赖关系始终添加在应用程序的pom.xml文件中。在此示例中, 你需要添加两个依赖项:

  1. JUnit依赖
  2. Mockito依赖
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13-rc-1</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-all</artifactId>
    <version>2.0.1-beta</version>
    <scope>test</scope>
</dependency>

步骤2:创建一个名为ToDoService.java的接口, 其中包含一个未实现的方法, 如下所示。

ToDoService.java

import java.util.List;

public interface ToDoService {
 
	public List<String> getTodos(String user);
 }

步骤3:创建一个名为ToDoBusiness.java的Java类, 其中包含一个参数化的构造函数和一个方法, 如下所示。

ToDoBusiness.java

import java.util.ArrayList;
import java.util.List;

// ToDoBusiness is a SUT (system under test) 
// ToDoService is a Dependency (as ToDoBusiness is dependent on it)

public class ToDoBusiness {

	public ToDoService doService;

	public ToDoBusiness(ToDoService doService) {
		this.doService = doService;
	}
	
	public List<String> getTodosforSpring(String user) {
		
		List<String> retrievedtodos = new ArrayList<String>();
		List<String> todos = doService.getTodos(user);
		
		for(String todo :todos) {
			if(todo.contains("Spring")) {
				retrievedtodos.add(todo);
			}
		}
		return retrievedtodos;
		}
 }

步骤4:在测试的源文件夹(src / test / java)中创建一个名为ToDoServiceStub.java的存根类, 以进行测试。

ToDoServiceStub.java

import java.util.Arrays;
import java.util.List;

public class ToDoServiceStub implements ToDoService   {

	public List<String> getTodos(String user) {
	
	return Arrays.asList(" Use Core Java ", " Use Spring Core ", " Use Hibernate ", " Use Spring MVC ");
	}
 }

步骤5:创建另一个名为ToDoBusinessStub.java的存根, 如下所示。

ToDoBusinessStub.java

import static org.junit.Assert.*;
import java.util.List;
import org.junit.Test;

public class ToDoBusinessStub {

	@Test
	public void test() {
		
		ToDoService doServiceStub = new ToDoServiceStub(); 
			
		ToDoBusiness business = new ToDoBusiness(doServiceStub);
	
        List<String> retrievedtodos = business.getTodosforSpring(" Dummy ");
        
        assertEquals(2, retrievedtodos.size());
       System.out.println(" Stub is working correctly...!!");
       }
 }

输出如下

以下输出显示存根工作正常。

Eclipse IDE中Mockito和JUnit的示例
Eclipse IDE中Mockito和JUnit的示例

存根的缺点

在上面的示例中, ToDoBusinessStub依赖于ToDoService接口, 因此我们创建了一个名为ToDoServiceStub的存根, 该存根返回虚拟值。 ToDoServiceStub什么都不是, 而是真正的Java类。使用存根存在许多维护问题。例如, 如果要向ToDoService接口添加新方法或从ToDoService接口删除现有方法, 则需要跟踪与此接口相关的存根。存根的另一个问题是使代码更加复杂的动态条件。

存根在简单的项目和场景中很有用, 但是在复杂的场景中, 我们需要比存根更动态的东西。为了克服这些弊端, 使用了模拟而不是存根。

在上面的示例中, 我们还没有使用Mockito框架, 因为我们创建了一个简单的测试模块。现在, 我们将创建一个模拟示例。在创建模拟示例之前, 我们应该了解示例中将要使用的一些重要概念和方法。

2.模拟示例

在这里, 我们将创建一个模拟对象的示例。以下步骤用于创建将Mockito与JUnit一起使用的测试示例。

步骤1:创建一个名为ToDoService的接口, 其中包含一个未实现的方法。

ToDoService.java

import java.util.List;

public interface ToDoService {
 
	public List<String> getTodos(String user);
 }

步骤2:现在, 为ToDoService接口创建一个名为ToDoBusiness的实现类。

ToDoBusiness.java

import java.util.ArrayList;
import java.util.List;

// ToDoBusiness is a SUT (system under test) 
// ToDoService is a Dependency (as ToDoBusiness is dependent on it)

public class ToDoBusiness {

	public ToDoService doService;

	public ToDoBusiness(ToDoService doService) {
		this.doService = doService;
	}
	
	public List<String> getTodosforHibernate(String user) {
		
		List<String> hibernatelist = new ArrayList<String>();
		List<String> Combinedlist = doService.getTodos(user);
		
		for(String todo: Combinedlist) {
			if(todo.contains("Hibernate")) {
				hibernatelist.add(todo);
			}
		}
		
		return hibernatelist;
		}
 }

步骤3:创建一个名为ToDoBusinessMock的JUnit测试用例, 以进行单元测试。

ToDoBusinessMock.java

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.util.Arrays;
import java.util.List;
import org.junit.Test;

public class ToDoBusinessMock {

	@Test
	public void testusing_Mocks() {
		
		ToDoService doService = mock(ToDoService.class);
		 
		List<String> combinedlist = Arrays.asList(" Use Core Java ", " Use Spring Core ", " Use w3eHibernate ", " Use Spring MVC ");
		when(doService.getTodos("dummy")).thenReturn(combinedlist);
		
		ToDoBusiness business = new ToDoBusiness(doService);
	
		List<String> alltd = business.getTodosforHibernate("dummy"); 
        
		System.out.println(alltd);
		assertEquals(1, alltd.size());
	}
 }

输出如下

以下输出显示测试已成功运行。它还显示该对象在列表中可用, 即”使用休眠”。

Eclipse IDE中Mockito和JUnit的示例

3.模拟List类的示例

在这里, 我们将创建一个模拟List类(java.util.List)的示例。

步骤1:创建一个名为TestList的模拟测试类以测试List类。

TestList.java

import static org.junit.Assert.*;
import static org.mockito.Mockito.when;

import java.util.List;
import org.junit.Test;
import org.mockito.Mock;

public class TestList {

	@Test
	public void testList_ReturnsSingle_value() {

		List mocklist = mock(List.class);
                           when(mocklist.size()).thenReturn(1);

		assertEquals(1, mocklist.size());
		assertEquals(1, mocklist.size());
		
                          System.out.println( mocklist.size());
		System.out.println(mocklist);
	}
 }

输出如下

以下输出显示测试成功运行, 并且列表中有一项可用。它还显示了对象的值。

Eclipse IDE中Mockito和JUnit的示例

4.列表的多个返回值的示例

在这里, 我们将创建一个模拟具有多个返回值的List类(java.util.List)的示例。在上一个示例中, 该列表仅返回一个对象(因为它仅包含一个对象), 而在下一个示例中, 该列表返回了多个值(由于它包含三个项目)。

步骤1:创建一个名为TestList的JUnit测试用例, 以测试List类。

TestList.java

import static org.junit.Assert.*;
import static org.mockito.Mockito.when;

import java.util.List;
import org.junit.Test;
import org.mockito.Mock;

public class TestList {	
	
	  @Test 
	  public void testList_Returns_MultipleValues() {
	  
	  List mocklist = mock(List.class);
	  when(mocklist.size()).thenReturn(1).thenReturn(2).thenReturn(3);
	  
	  assertEquals(1, mocklist.size()); 
	  assertEquals(2, mocklist.size());
	  assertEquals(3, mocklist.size());
	  
	  System.out.println(mocklist.size()); 
	  System.out.println(mocklist);
	  
	  }
 }

输出如下

以下输出显示该测试已成功运行, 并且返回了List的多个返回值。

Eclipse IDE中Mockito和JUnit的示例

5.模拟List.get()方法的示例

在此示例中, 我们将模拟List.get()方法。要使用get()方法, 我们需要在其中传递一个值(数字), 如示例所示。

步骤1:创建一个名为TestList的测试类来模拟List.get()方法。

TestList.java

import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.util.List;
import org.junit.Test;

public class TestList {
	 
        @Test 
          public void testList_get() {
	  
	  List mocklist = mock(List.class);
	  
	  when(mocklist.get(0)).thenReturn("Mockito");
	 
	  assertEquals("Mockito", mocklist.get(0));
	  System.out.println(mocklist.get(0));
	  }
 }

输出如下

以下输出显示当列表的索引值为0时测试成功运行, 并且返回给定的String, 即Mockito。

Eclipse IDE中Mockito和JUnit的示例

但是, 如果我们要检查assertEquals(” Mockito”, mocklist.get(1)), 则测试将失败并引发错误, 如下所示。

Eclipse IDE中Mockito和JUnit的示例

当调用mocklist.get()方法时, 它将始终返回Mockito。为了避免这种情况, 参数匹配器应运而生。借助参数匹配器, 我们可以获取任何整数的值, 无论该值是否存根。

6. verify()方法的示例

在这里, 我们将创建一个使用Mockito的verify()方法进行测试的示例。

步骤1:创建一个名为ToDoService的接口, 其中包含两个未实现的方法。

ToDoService.java

import java.util.List;

public interface ToDoService {
 
	public List<String> getTodos(String user);
	public void deleteTodos(String doString); 
 }

步骤2:创建名为ToDoBusiness的实现类, 并删除与”休眠”无关的todo(List的对象)。

ToDoBusiness.java

import java.util.ArrayList;
import java.util.List;

// ToDoBusiness is a SUT (system under test) 
// ToDoService is a Dependency (as ToDoBusiness is dependent on it)

public class ToDoBusiness {

	public ToDoService doService;

	public ToDoBusiness(ToDoService doService) {
		this.doService = doService;
	}
		
public void deleteTodosNotRelatedToHibernate(String user) {
		
		List<String> Combinedlist = doService.getTodos(user);
		
		for(String todos:Combinedlist) {
			if(!todos.contains("Hibernate")) {
				doService.deleteTodos(todos);
			}
		}
	}
 }

步骤3:创建一个名为ToDoBusinessMock的模拟类, 并验证是否调用了指定的方法(deleteTodosNotRelatedToHibernate())。

ToDoBusinessMock.java

import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;

import java.util.Arrays;
import java.util.List;
import org.junit.Test;

public class ToDoBusinessMock {
	

	@Test
	public void deleteTodosusing_BDD() {
		
		//Given
		ToDoService todoService = mock(ToDoService.class);
		 
		List<String> combinedlist = Arrays.asList("Use Hibernate Java", "Use Hibernate Core", "Use Hibernate", "Use Spring MVC");
		
	        given(todoService.getTodos("dummy")).willReturn(combinedlist);
		
		ToDoBusiness business = new ToDoBusiness(todoService);
	
		//When
		 business.deleteTodosNotRelatedToHibernate("dummy");
        
		//Then
		verify(todoService).deleteTodos("Use Spring MVC");
		}
 }

输出如下

以下输出显示测试已成功运行。因此, 表明所有方法都得到了很好的验证。

Mockito verify()方法

如果你希望某个项目永远不被调用或删除, 则可以使用一个方法never()进行操作, 例如:

verify(todoService, never()).deleteTodos("Use Hibernate Java");
verify(todoService, never()).deleteTodos("Use Hibernate");

通过使用times()方法, 可以指定特定方法的调用次数。例如:

verify(todoService, times(1)).deleteTodos("Use Spring MVC");

同样, 你可以使用其他Mockito方法, 例如atLeastOnce(), atLeast()和atMost()和verify()。

7. Mockito spy()的示例

为了测试目的, 我们创建一个名为SpyTest的测试类。

SpyTest.java

import static org.junit.Assert.*;
import static org.mockito.Mockito.spy;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;

public class SpyTest {

	@Test
	public void test() {
		
		List spyArrayList = spy(ArrayList.class);
		assertEquals(0, spyArrayList.size());

                        // adding an item in the list
		spyArrayList.add("Mockito");
		assertEquals(1, spyArrayList.size());
	}
 }

在上面的代码中, 我们创建了ArrayList类的间谍并检查了其大小。列表的大小为零, 表示列表为空。检查列表大小后, 我们在列表中添加了一个项目(” Mockito”)。现在, 由于我们讨论过间谍会创建真实对象的部分模拟, 因此大小增加了一个。

输出如下

模仿间谍法

spy()方法让实际动作继续发生, 除了他们想改变行为的东西。这意味着spy()方法允许我们跟踪真实对象发生的情况, 并允许我们覆盖特定行为。


赞(0)
未经允许不得转载:srcmini » Eclipse IDE中Mockito和JUnit的示例

评论 抢沙发

评论前必须登录!