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

Mockito监视或模拟抽象类

抽象类被称为使用abstract关键字声明的类, 该类可能包含也可能不包含abstract方法。在Java中, 无法实例化抽象类, 但可以将其子类化。它还可以具有静态字段和静态方法。

在本节中, 我们将讨论抽象类的模拟或监视。我们将分析使用非抽象方法测试抽象类的几种情况。

为了监视或模拟抽象类, 我们需要添加以下Maven依赖项:

  • JUnit的
  • Mockito
  • PowerMock

下面给出了项目所需的所有依赖项:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

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

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>1.7.4</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito</artifactId>
    <version>1.7.0</version>
    <scope>test</scope>
</dependency>

仅在使用PowerMock的测试中才需要PowerMock依赖项。

模拟抽象类的例子

1.使用Mockito.spy()监视抽象类

在此示例中, 我们将使用Mockito.spy()方法监视抽象类。 Mockito.spy()方法用于创建抽象类的间谍实例。

步骤1:创建一个名为Abstract1_class的抽象类, 其中包含抽象方法和非抽象方法。

Abstract1_class.java

public abstract class Abstract1_class {

	public abstract int newAbstractmethod();
	
	public String methodUnderTest() {
		return "one" ;
	}
 }

步骤2:创建一个名为Abstract1Test的JUnit测试用例。它包含抽象类的间谍实例。

Abstract1Test.java

import static org.junit.Assert.*;
import org.junit.Test;
import org.mockito.Mockito;
import junit.framework.Assert;

public class Abstract1Test {

	@Test
	public void testing_usingSpy() {
		 Abstract1_class abstclas = Mockito.spy(Abstract1_class.class);
		 
		 String res = abstclas.methodUnderTest();
		 Assert.assertEquals("one", res);
	}
 }

输出如下

以下输出显示测试已成功运行。

监视或模拟抽象类

使用Mockito.spy()方法的缺点是, 它将在创建间谍实例的过程中调用抽象类的构造函数。在大多数情况下, 构造函数使用外部依赖关系, 这可能会妨碍我们执行单元测试。这些外部依赖关系通常称为测试障碍。这是使用Mockito.mock()方法模拟抽象类的原因。

2.使用Mockito.mock()模拟抽象类

在此示例中, 我们将使用Mockito.mock()方法模拟抽象类。

通常, 模拟用于创建类的克隆或伪对象。换句话说, 它使类脱离了其逻辑或算法。创建的模拟实例在方法内部不包含代码(逻辑)。

步骤1:创建一个名为Abstract_Class的抽象类, 其中包含抽象方法和非抽象方法。

Abstract_Class.java

public abstract class Abstract_Class {

	public String sayMock() {
		return "Hii.. " + getName() + symbol() ;
	}
	
	private String symbol()	{
		return "!!";
	}
	
	protected abstract String getName();
   }

步骤2:创建一个名为AbstractTestClass的JUnit测试用例, 以模拟抽象类。

AbstractTestClass.java

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

import org.junit.Test;

public class AbstractTestClass {

	@Test
	public void test_AbstractClasses() {
		
		Abstract_Class ac = mock(Abstract_Class.class);
		when(ac.sayMock()).thenCallRealMethod();
		when(ac.getName()).thenReturn("Jyotika");
		assertEquals("Hii.. Jyotika!!", ac.sayMock());	
	}
  }

在上面的代码中, ac是使用Mockito.mock()方法创建的模拟实例。

输出如下

以下输出显示使用Mockito成功运行了测试。

监视或模拟抽象类

上面的方法不是最好的, 但是可以使用。建议使用下一种方法, 因为它使用PowerMock, 并且可以控制抽象类中定义的私有方法。

3.使用PowerMock模拟抽象类

在下面的示例中, 我们将使用PowerMockito.mock()方法来模拟抽象类。使用PowerMock代替Mockito.mock()是更好的方法, 因为它可以控制私有方法和静态方法。

步骤1:创建一个名为Abstract_class的抽象类, 其中包含抽象方法和非抽象方法。

Abstract_class.java

public abstract class Abstract_Class {

	public abstract int myAbstractMethod();
	
	public String sayMock() {
		return getName() + "13" ;
	}
	
	 private String getName()	{
		return "Jyotika";
	}
 }

步骤2:创建一个名为AbstractTestClass的JUnit测试用例以进行测试。

AbstractTestClass.java

import static org.junit.Assert.*; 

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest( Abstract_Class.class)
public class AbstractTestClass {

	@Test
	public void test_AbstractClassesusing_PowerMock() throws Exception {
		// given 
		Abstract_Class ac = PowerMockito.mock(Abstract_Class.class);
		PowerMockito.doCallRealMethod().when(ac).sayMock();
		PowerMockito.doReturn("Sharma").when(ac , "getName");
		//when
		String newstring = ac.sayMock();
		//then
		assertEquals("Sharma13", newstring);
		System.out.println(newstring);
	}
 }

在这里, 我们要求PowerMock对私有方法的返回值进行存根, 以便我们可以在没有任何测试障碍的情况下测试sayMock()方法。仅Mockito不能使用此方法, 这就是为什么我们将PowerMock与Mockito一起使用的原因。

输出如下

以下输出显示使用PowerMock和Mockito成功运行了测试。

监视或模拟抽象类

赞(1)
未经允许不得转载:srcmini » Mockito监视或模拟抽象类

评论 抢沙发

评论前必须登录!