`

EasyMock, PowerMock 一起mock静态方法 static method

 
阅读更多

在哪下载包就不说了,要下这么几个:

easymock-3.1

easymockclassextension-3.1

powermock-easymock-junit-1.5

 

创建一个待会儿被mock的类, Job

package com.jwu.mock;

import java.util.Random;

public class Job {

	public Job(String name) {
		this.name = name;
	}

	private String name;

	public String getName() {
		return name;
	}

	public static int generateId() {
		return new Random().nextInt(1000);
	}

}
 

再创建一个待会儿需要测试的类,该被测试的类需要用到被mock的类,Person

package com.jwu.mock;

public class Person {

	private int id;
	private String name;
	private Job job;

	public Person() {
		this(1, "noname", new Job("nojob"));
	}

	public Person(int id, String name, Job job) {
		this.id = id;
		this.name = name;
		this.job = job;
	}

	public String getJobName() {
		return job.getName();
	}

	public int getJobId() {
		return Job.generateId();
	}

	public String getJobNamePrefixId() {
		return getJobId() + getJobName();
	}

	public String toString() {
		return "#" + id + ": " + name;
	}
}
 

然后开始写UT类,这里演示了使用EasyMock去mock普通方法,和PowerMock去模拟静态方法:

package com.jwu.mock;

import static org.junit.Assert.assertEquals;

import org.easymock.EasyMock;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(Job.class)
public class MockStaticTest {

	@Test
	public void testMockMethod() {
		Job job = EasyMock.createMock(Job.class);
		String jobName = "owen";
		EasyMock.expect(job.getName()).andReturn(jobName);
		EasyMock.replay(job);

		Person person = new Person(123, "testName", job);
		assertEquals(person.getJobName(), jobName);
	}

	@Test
	public void testStatic() {
		Job job = EasyMock.createMock(Job.class);
		int expectId = 1234;
		PowerMock.mockStatic(Job.class);
		EasyMock.expect(Job.generateId()).andReturn(expectId);
		PowerMock.replay(Job.class);

		Person person = new Person(123, "testName", job);

		assertEquals(person.getJobId(), expectId);
	}

	@Test
	public void testMix() {
		Job job = EasyMock.createMock(Job.class);
		int expectId = 1234;
		PowerMock.mockStatic(Job.class);
		EasyMock.expect(Job.generateId()).andReturn(expectId);
		PowerMock.replay(Job.class);
		String jobName = "owen";
		EasyMock.expect(job.getName()).andReturn(jobName);
		EasyMock.replay(job);

		Person person = new Person(123, "testName", job);

		assertEquals(person.getJobNamePrefixId(), expectId + jobName);
	}
}
 

 

没有什么特别的,工具和包看一下就会了,真正重要的是怎么去设计UT。

分享到:
评论

相关推荐

    使用PowerMock来Mock静态函数

    3. 创建Mock:在测试方法中,使用`PowerMockito.mockStatic(Class)`来模拟整个静态类,或者使用`PowerMockito.when(Class.method()).thenReturn(value)`来指定静态方法在特定条件下的返回值。 4. 执行测试:进行正常...

    EasyMock and PowerMock入门PPT

    PowerMock是EasyMock的一个扩展,它允许模拟静态方法、构造函数、final类和方法,以及删除静态初始化器。这对于那些不能直接用EasyMock模拟的场景非常有用,例如模拟Java的`java.lang`包中的类。 **运行PowerMock...

    powermock单元测试

    3. **模拟静态方法**:使用`PowerMockito.mockStatic(Class<?> clazz)`来模拟静态方法。然后通过`when`和`thenReturn`(或其他方法)来定义静态方法的行为。 4. **模拟私有方法**:首先,需要使用`PowerMockito.spy...

    powermock-easymock-junit-1.6.1.zip

    5. 在测试方法中,使用`PowerMockito.mockStatic()`模拟静态方法,`when()`定义期望行为,`thenReturn()`等方法指定返回值。 6. 执行实际的测试代码,并在测试方法后使用`verify()`检查mock对象的行为是否符合预期。...

    powermock-easymock-junit-1.5.4.zip

    PowerMock是一个扩展了其他模拟框架(如EasyMock、Mockito等)的库,它可以模拟静态方法、构造函数、final类和方法、私有方法以及删除静态初始化器等,这些都是传统模拟框架难以处理的情况。在进行单元测试时,有些...

    easymock3.1 jar包和powermock1.4.10 jar包(以及附带junit jar包)

    PowerMock1.4.10则是Easymock的一个增强版,它扩展了Easymock的功能,允许对静态方法、构造函数、final类和方法、私有方法以及删除静态初始化器等进行模拟。在许多情况下,这些是Easymock无法处理的,但它们在实际...

    PowerMock\EasyMock的相关资料和文档

    EasyMock是基础,而PowerMock则在其基础上扩展了更多的功能,使得一些难以模拟的Java特性如静态方法、构造函数、final类和方法、删除静态初始化器等变得可测试。 EasyMock是一个强大的模拟框架,它允许开发者创建...

    汪文君powermock实战教学

    PowerMock是在easymock和mockito的基础上构建的,旨在提供更多的功能,解决传统mock框架无法处理的一些问题。通过这个系列的教学,学习者将能够全面掌握PowerMock的各种特性和用法。 1. **入门**:在这个阶段,你会...

    powermock

    PowerMock 提供了 `PowerMockito.mockStatic` 方法,允许我们指定静态方法的行为,从而在测试中隔离静态方法的依赖。 3. **构造函数模拟**: 有些情况下,被测试类可能依赖于私有构造函数或不可实例化的类。...

    powermock源码学习 支持模拟静态方法、构造函数、final类和方法、私有方法以及移除静态初始化器的模拟工具

    PowerMock的核心功能在于其能够通过提供定制的类加载器和应用一些字节码操作技巧,实现对静态方法、构造方法、私有方法和final方法的模拟。例如,在进行单元测试时,有时候我们并不希望测试数据进入实际的数据库,...

    EasyMock介绍及安装方法

    不能 mock 类的 static 方法。同样如果 private 方法被调用,只能执行原有的正常代码。 不能 mock 类的一些特殊方法:equals(),toString() 和 hashCode()。原因是 EasyMock 在实现时为每个 class mock 对象提供了内...

    easyMock resource

    EasyMock通过`expect`方法定义mock对象的行为,`replay`方法启动模拟,`verify`方法检查mock对象的调用是否符合预期。 将EasyMock与JUnit结合,我们可以创建更加复杂的测试场景。例如,当我们测试一个类A,它依赖于...

    PowerMock实战手册

    PowerMock允许我们创建mock的静态方法,从而在测试中控制它们的行为。 2. **mock final类和方法**:final类和方法不能被子类化,也就无法常规地mock。PowerMock可以通过字节码操作来模拟它们。 3. **避免依赖初始...

    PowerMock实战手册.pdf

    在单元测试中,可以使用MockStatic来模拟静态方法,以测试依赖于这些方法的代码。 ### Verifying #### 使用场景 验证是一个重要环节,用于检查方法是否按照预期被调用。 #### 业务代码 在编写业务代码时,为了...

    单元测试模拟框架PowerMock.zip

    通过提供定制的类加载器以及一些字节码篡改技巧的应用,PowerMock 现了对静态方法、构造方法、私有方法以及 Final 方法的模拟支持,对静态初始化过程的移除等强大的功能。因为 PowerMock 在扩展功能时完全采用和被...

    PowerMock实战

    在后续章节中,将会进一步深入讲解PowerMock的高级特性,比如如何模拟局部变量(MockLocalVariable),如何模拟静态方法(MockStatic)以及如何使用验证(Verifying)。此外,本书还介绍了如何模拟私有方法、构造...

Global site tag (gtag.js) - Google Analytics