`

使用Guava Supplier Mock Datetime

阅读更多
通过下面的例子了解Guava Supplier的用法.在做单元测试的时候, 我们可能需要Mock掉一些对外部资源的依赖. 比如时间, 随机数, 系统文件访问.

下面是将要测试的代码, 将当前时间输出:
@Controller
@RequestMapping(value = "/time")
@VisibleForTesting
class TimeController {
 
	@RequestMapping(value = "/current", method = RequestMethod.GET)
	@ResponseBody
	public String showCurrentTime() {
		// BAD!!! Can't test
		DateTime dateTime = new DateTime();
		return DateTimeFormat.forPattern("hh:mm").print(dateTime);
	}
}


但是这里有一个问题, 就是代码中是直接new的一个DateTime对象, 所以造成了对系统时间的直接依赖. 导致我们对输出时间的测试比较困难, 因此这里我们要借助Guava Supplier.

Supplier只有一个方法: get(), 返回suppiler构建的对象. 比如下面的例子:
public class FirstNameSupplier implements Supplier<String> {
 
	private String value;
	private static final String DEFAULT_NAME = "GUEST";
	 
	public FirstNameSupplier() {
		// Just believe that this goes and gets a User from somewhere
		String firstName = UserUtilities.getUser().getFirstName();
		// more Guava
		if(isNullOrEmpty(firstName)) {
			value = DEFAULT_NAME;
		} else {
			value = firstName;
		}
	}
	 
	@Override
	public String get() {
		return value;
	}
}


通过上面的代码你将不再关心firstName是什么, 只需要调用get方法即可.


对目标代码进行重构

实现一个DateTime Supplier. 同时提供一个接口, 方便测试:
public interface DateTimeSupplier extends Supplier<DateTime> {
	DateTime get();
}


下面是具体实现
public class DateTimeUTCSupplier implements DateTimeSupplier {
	@Override
	public DateTime get() {
		return new DateTime(DateTimeZone.UTC);
	}
}


然后注入DateTimeSupplier:
@Controller
@RequestMapping(value = "/time")
@VisibleForTesting
class TimeController {
 
	@Autowired
	@VisibleForTesting
	// Injected DateTimeSupplier
	DateTimeSupplier dateTime;
	 
	@RequestMapping(value = "/current", method = RequestMethod.GET)
	@ResponseBody
	public String showCurrentTime() {
		return DateTimeFormat.forPattern("hh:mm").print(dateTime.get());
	}
}


创建一个MockDateTimeSupplier用来做测试:
public class MockDateTimeSupplier implements DateTimeSupplier {
 
	private final DateTime mockedDateTime;
	 
		public MockDateTimeSupplier(DateTime mockedDateTime) {
		this.mockedDateTime = mockedDateTime;
	}
	 
	@Override
	public DateTime get() {
		return mockedDateTime;
	}
}


最后是测试代码:
public class TimeControllerTest {
 
	private final int HOUR_OF_DAY = 12;
	private final int MINUTE_OF_DAY = 30;
	 
	@Test
	public void testShowCurrentTime() throws Exception {
		TimeController controller = new TimeController();
		// Create the mock DateTimeSupplier with our known DateTime
		controller.dateTime = new MockDateTimeSupplier(new DateTime(2012, 1, 1, HOUR_OF_DAY, MINUTE_OF_DAY, 0, 0));
		 
		// Call our method
		String dateTimeString = controller.showCurrentTime();
		 
		// Using hamcrest for easier to read assertions and condition matchers
		assertThat(dateTimeString, is(String.format("%d:%d", HOUR_OF_DAY, MINUTE_OF_DAY)));
}
 
}


总体感觉代码还是比较多的, 又是接口又是实现的. 而目标就是为了对系统时间进行mock, 不过提供了一种单元测试的思路.

原文: http://java.dzone.com/articles/mocking-jodatimes-datetime-and
分享到:
评论
1 楼 Jen 2013-06-16  
用powermock 直接把静态方法mock掉应该能搞定的

相关推荐

    使用google guava 实现定时缓存功能

    Guava的缓存是线程安全的,无需额外的同步措施即可在多线程环境中使用。 综上所述,Google Guava的定时缓存功能使得我们能够轻松地在Java应用中实现高效的缓存机制,有效减少计算和网络请求的负担,提升整体性能。...

    SpringBoot使用Guava实现日志脱敏

    Guava脱敏是指使用Google Guava库进行敏感数据的脱敏处理。脱敏是一种保护个人隐私和数据安全的技术,通过对敏感数据进行处理,将其转换为不敏感或匿名数据,以防止数据泄露和滥用。 在Guava中,脱敏通常涉及对字符...

    guava使用方法教程

    guava 使用方法 教程

    guava-18.0(guava-18.0.jar和guava-18.0-sources.jar)

    `guava-18.0.jar`是Guava库的编译后的二进制版本,包含了所有Guava类和方法的字节码,开发者可以直接在项目中引用这个JAR文件来使用Guava的功能。Guava 18.0版本包含了大量实用工具,例如: 1. **集合框架扩展**:...

    guava-23.0.zip guava.jar guava

    在使用Guava时,需要将guava.jar添加到项目的类路径中,以便能够使用其中的类和方法。如果使用的是Maven或Gradle,可以通过添加对应的依赖来引入Guava库。 总的来说,Guava是一个非常强大的Java库,它提供了大量...

    Guava使用培训教程

    ### Guava概述 Guava是Google推出的一款Java核心类库,旨在通过添加一系列经过充分测试且高度实用的工具集来优化Java...对于任何希望提高开发效率和代码质量的Java开发者来说,Guava都是一个值得深入学习和使用的库。

    guava-19.0 jar和sources

    在Java开发中,Guava库被广泛使用,因为它包含了大量的集合框架、并发支持、缓存机制、字符串处理、I/O操作等多个方面的功能。 标题中的"guava-19.0.jar"是Guava库的19.0版本的二进制文件,包含了编译后的Java类,...

    guava-23.0-API文档-中文版.zip

    赠送jar包:guava-23.0.jar; 赠送原API文档:guava-23.0-javadoc.jar; 赠送源代码:guava-23.0-sources.jar; 赠送Maven依赖信息文件:guava-23.0.pom; 包含翻译后的API文档:guava-23.0-javadoc-API文档-中文...

    guava-21.0-rc2 、guava-21.0-rc2-javadoc 、guava-21.0-rc2-sources

    1. **guava-21.0-rc2**: 这是Guava库的二进制发行版,包含了编译好的Java类库,可以直接在项目中引用使用。21.0-rc2表示这是一个候选版本,Release Candidate,意味着这是发布前的最后一个测试版本,通常在正式发布...

    guava-20.0-API文档-中文版.zip

    赠送jar包:guava-20.0.jar; 赠送原API文档:guava-20.0-javadoc.jar; 赠送源代码:guava-20.0-sources.jar; 赠送Maven依赖信息文件:guava-20.0.pom; 包含翻译后的API文档:guava-20.0-javadoc-API文档-中文...

    guava-17.0-API文档-中文版.zip

    赠送jar包:guava-17.0.jar; 赠送原API文档:guava-17.0-javadoc.jar; 赠送源代码:guava-17.0-sources.jar; 赠送Maven依赖信息文件:guava-17.0.pom; 包含翻译后的API文档:guava-17.0-javadoc-API文档-中文...

    guava-18.0-API文档-中文版.zip

    赠送jar包:guava-18.0.jar; 赠送原API文档:guava-18.0-javadoc.jar; 赠送源代码:guava-18.0-sources.jar; 包含翻译后的API文档:guava-18.0-javadoc-API文档-中文(简体)版.zip 对应Maven信息:groupId:...

    重试框架spring-retry以及guava-retry的使用

    本文将深入探讨两个常用的重试框架:Spring Retry和Guava Retry,并通过一个名为`retry-starter`的Spring Boot项目实例,来解析它们的使用方式以及差异。 首先,我们来看Spring Retry。Spring Retry是Spring框架的...

    Guava-Cache本地缓存案例代码

    本案例代码将详细介绍Guava Cache的使用,包括缓存的创建、删除、获取、失效监听、加载以及淘汰策略。 1. **缓存创建**: Guava Cache可以通过CacheBuilder类创建。CacheBuilder提供了丰富的配置选项,如最大容量...

    Guava-21.0 JAR/SRC/DOC 三和一

    Guava是Google开发的一个核心库,它为Java开发人员...通过这个压缩包,开发者不仅可以直接在项目中使用Guava,还可以深入研究其源代码,学习Google的编程理念,以及查阅详细的API文档,确保正确、高效地使用Guava库。

    Guava 工程项目包 有实例

    Guava 是一个由 Google 开发并维护的 Java 库,它提供了许多实用工具类和集合框架的增强功能,极大地丰富了 Java 平台的标准库...此外,了解并掌握 Guava 的使用,能够使你的代码更加简洁、高效,同时减少潜在的错误。

    guava-11.0.2-API文档-中文版.zip

    赠送jar包:guava-11.0.2.jar; 赠送原API文档:guava-11.0.2-javadoc.jar; 赠送源代码:guava-11.0.2-sources.jar; 赠送Maven依赖信息文件:guava-11.0.2.pom; 包含翻译后的API文档:guava-11.0.2-javadoc-API...

    guava-31.1-jre.jar

    guava

    guava多个版本jar包

    Guava是Google开发的一个Java库,它包含许多Google核心库使用的功能,如集合、缓存、并发库、原生类型支持、字符串处理、I/O等。这个压缩包包含的是Guava的不同版本,分别是guava-2.6.2.jar、guava-18.0.jar、guava-...

Global site tag (gtag.js) - Google Analytics