`
jilen
  • 浏览: 97657 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

开始使用Mockito -- 使用Mockito和JUnit【一】

    博客分类:
  • java
阅读更多

一段常见的代码 

单元测试是项目的重要组成部分。尤其是对持续发展的产品,单元测试在后期的维护,回归有重要等方面有重要作用。

  这样代码在项目中随处可见,看看我们应该如何测试

 

 

public class NotifyService {
	private UserCenter uc;
	private MessageCenter mc;

	public void sendMessage(long userId, String message) {
		String email = uc.getUser(userId).getEmail();
		mc.sendEmail(email, message);
	}

	public void setUc(UserCenter uc) {
		this.uc = uc;
	}

	public void setMc(MessageCenter mc) {
		this.mc = mc;
	}
}

UserCenter和MessageCenter都是接口,User是一个简单的JavaBean

 

由于uc和mc乃外部依赖,此类不需也不应保证uc和mc的正确性,此类只需保证:

  假设uc和mc是正确的,那么我也是正确的。

所以需要隔离依赖--使用mock

 

使用EasyMock

如果使用EasyMock,此类之单元测试或许如下[需要static import org.easymock.EasyMock类的相关方法]

 

 

public class EasyMockNotifyServiceTest {
	private NotifyService notifyService;
	private UserCenter uc;
	private MessageCenter mc;

	@Before
	public void setUp() {
		notifyService = new NotifyService();
		uc = createMock(UserCenter.class);
		mc = createMock(MessageCenter.class);
		notifyService.setUc(uc);
		notifyService.setMc(mc);
	}

	@Test
	public void testSendMessage() {
		Long id = 1L;
		String email = "foo@bar";
		String message = "hello";
		expect(uc.getUser(id)).andReturn(createUserWithEmail(email));
		mc.sendEmail(eq(email), eq(message));
		replay(uc);
		replay(mc);
		notifyService.sendMessage(id, message);
		verify(mc);//verify a mocked behavior
	}

	private User createUserWithEmail(String email) {
		User user = new User();
		user.setEmail(email);
		return user;
	}
}
 

 

   当然,此测试并不充分,easymock需要mock每个依赖,对mock的所有方法调用作expect,然后验证需要验证的行为。

 

 

 

mc.sendEmail(eq(email), eq(message));

 

    此处代码理解起来有些怪异,实际上,此处的语义应该是 expect mc.sendEmail... called,即方法执行完毕后sendMail必以正确的参数调用,奈何java 泛型中并未覆盖void型,所以通常会在mock行为调用之后

加上此行以明确语义

expectLastCall().times(1);

 

    另外一个值得注意的地方

 

verify(mc);//verify a mocked behavior

 

    并未验证uc,我的想法是对于uc我们需要它提供数据(桩),而不需要验证其行为。

 

    使用Mockito

    假使使用Mockito,单元测试也许是这个样子的[需要static import org.mockito.Mockito类的相关方法]

 

public class NotifyServiceTest {
	private NotifyService notifyService;
	private UserCenter uc;
	private MessageCenter mc;

	@Before
	public void setUp() {
		notifyService = new NotifyService();
		uc = mock(UserCenter.class);
		mc = mock(MessageCenter.class);
		notifyService.setUc(uc);
		notifyService.setMc(mc);
	}

	@Test
	public void testSendMessage() {
		long userId = 1L;
		String email = "foo@bar";
		when(uc.getUser(userId)).thenReturn(createUserWithEmail(email));
		notifyService.sendMessage(userId, "hello");
		verify(mc).sendEmail(eq(email), eq("hello"));
	}

	private User createUserWithEmail(String email) {
		User user = new User();
		user.setEmail(email);
		return user;
	}

}
 

看到testSendMessage方法

 

@Test
	public void testSendMessage() {
		long userId = 1L;
		String email = "foo@bar";
		when(uc.getUser(userId)).thenReturn(createUserWithEmail(email));
		notifyService.sendMessage(userId, "hello");
		verify(mc).sendEmail(eq(email), eq("hello"));
	}

 

 

语义不言自明

测试前,从uc获得email

测试后,必须调用mc.sendEmail,所以验证之

 

小结

通过一个简单的例子,可以看到:mockito在使我们的测试代码更直接,语义更明确

 

 

0
1
分享到:
评论

相关推荐

    mockito-jar.zip

    mockito-all-1.10.19.jar mockito-core-4.5.1.jar mockito-junit-jupiter-4.5.1.jar mockito-junit-jupiter-4.5.1-sources.jar

    mockito-junit-jupiter-3.6.0.jar

    mockito-junit-jupiter-3.6.0.jarmockito-junit-jupiter-3.6.0.jar

    mockito-junit-jupiter-3.3.3.jar

    mockito-junit-jupiter-3.3.3.jarmockito-junit-jupiter-3.3.3.jar

    mockito-1.9.5.zip

    当我们进行单元测试时,Mockito 和 JUnit 结合使用可以创建高效且易于维护的测试代码。 1. **Mockito 框架**: Mockito 允许开发者创建模拟对象(mock objects)来代替真实的依赖,这样在测试中就可以控制这些依赖...

    mockito-core-3.6.0.jar

    mockito-core-3.6.0.jarmockito-core-3.6.0.jar

    mockito-junit-jupiter-3.1.0.jar

    java运行依赖jar包

    powermock-mockito-junit-1.6.2.zip

    PowerMock-Mockito-JUnit-1.6.2.zip 是一个包含PowerMock、Mockito和JUnit集成库的压缩包,适用于Java开发环境。这个版本的PowerMock要求使用1.6或更高版本的Java Development Kit (JDK)。下面将详细解释这三个主要...

    powermock-mockito-junit-1.6.3.zip 当前最新版

    PowerMock-Mockito-JUnit-1.6.3.zip 是一个包含最新版本的 PowerMock、Mockito 和 JUnit 库的压缩文件。这些工具在Java开发中被广泛用于单元测试和模拟,尤其对于处理静态方法、构造器、final类和方法、私有方法等...

    mockito-junit-jupiter-3.9.0.jar中文-英文对照文档.zip

    ·本文档为双语同时展示,一行原文、一行译文,可逐行对照,避免了原文/译文来回切换的麻烦; ·有原文可参照,不再担心翻译偏差误导; ·边学技术、边学英语。 ·只翻译了该翻译的内容,如:注释、说明、描述、...

    PowerMock+Mockito-junit测试套件1.6.3版本

    在本文中,我们将深入探讨"PowerMock+Mockito-junit测试套件1.6.3版本"中的关键概念、功能和使用方法。 **PowerMock** PowerMock是一个扩展了其他Mocking框架(如EasyMock和Mockito)的库,它允许开发者对静态方法...

    mock开发所用到的2个核心JAR

    Mockito-core通常与其它依赖库(如JUnit或TestNG)一起使用,以实现完整的单元测试解决方案。 **Mockito主要知识点:** 1. **Mock对象**:Mockito允许开发者创建mock对象,这些对象可以模仿真实对象的行为。在测试...

    powermock-with-mockito-core:带有 mockito-core 而不是 mockito-all 的 PowerMock

    使用 mockito-core 而不是 mockito-all 的 PowerMock 示例。 问题(参见 pom.xml): a) 如果 JUnit 在 powermock-api-mockito 之前是显式依赖项,则 JUnit 的 Hamcrest 1.3 依赖项会获胜并且测试运行良好。 b) ...

    mockito-core-3.6.0.jar中文-英文对照文档.zip

    ·本文档为双语同时展示,一行原文、一行译文,可逐行对照,避免了原文/译文来回切换的麻烦; ·有原文可参照,不再担心翻译偏差误导; ·边学技术、边学英语。 ·只翻译了该翻译的内容,如:注释、说明、描述、...

    mockito-junit-jupiter-3.3.3.jar中文-英文对照文档.zip

    ·本文档为双语同时展示,一行原文、一行译文,可逐行对照,避免了原文/译文来回切换的麻烦; ·有原文可参照,不再担心翻译偏差误导; ·边学技术、边学英语。 ·只翻译了该翻译的内容,如:注释、说明、描述、...

    powermock-mockito-demo:使用springboot的powermock-mockito-demo

    它间接引用 junit-4.12 mockito-core-2.15.0 但是官网powermock 1.7.x只支持2.8.0-2.8.9,如果使用默认引入版本,会出现找不到某些方法的异常. 需要自定义mockito-core为相应版本。 ServiceAspect只是为了验证当spy...

    junit单元测试架包及依赖集成版(包含hamcrest-all-1.3.jar、junit-4.12.jar、mockito-all-1.10.19.jar)

    junit单元测试所需架包及依赖集成版(包含hamcrest-all-1.3.jar、junit-4.12.jar、mockito-all-1.10.19.jar),引入项目即可直接使用,不依赖网络 使用教程及自动化测试示例 请看...

    Java-Junit-Mockito

    Java-Junit-Mockito 课程概述步骤列表JUnit步骤01:需要单元测试步骤02:设置您的第一个JUnit步骤03:第一个成功的JUnit。 Green Bar和assertEquals步骤04:重构您的第一个JUnit测试步骤05:第二个JUnit示例...

    mockito-junit-jupiter-3.1.0-sources.jar

    java运行依赖jar包

    android-junit4-test-mockito-0.1-sources.jar

    官方版本,亲测可用

    mockito-junit-jupiter-3.1.0.jar中文-英文对照文档.zip

    ·本文档为双语同时展示,一行原文、一行译文,可逐行对照,避免了原文/译文来回切换的麻烦; ·有原文可参照,不再担心翻译偏差误导; ·边学技术、边学英语。 ·只翻译了该翻译的内容,如:注释、说明、描述、...

Global site tag (gtag.js) - Google Analytics