本文要求读者已具备juit和jmock基础
在TDD过程中需要测试代码中的System.in和System.out。
技术难点包括
1、mock宿主还原
2、inout参数的行为模拟
3、mock system.in和out
1、测试主体
@Service class ConsoleManagerBizImpl{ private static Logger LOGGER = Logger .getLogger(ConsoleManagerBizImpl.class); public String readLine() { final Scanner scanner = new Scanner(System.in); String lineMessage = null; while (!StringUtils.hasText(lineMessage)) { lineMessage = scanner.nextLine(); } return lineMessage; } public void writeLine(final String toWrite) { LOGGER.info(toWrite); } }
2、测试类
public class ConsoleManageBizImplTest { @Autowired private ConsoleManagerBizImpl biz; /** * 既可 mock 接口也可以 mock 类 */ protected final Mockery context = new JUnit4Mockery() { { setImposteriser(ClassImposteriser.INSTANCE); } }; /** * 改变预期的参数 * * @param result * 预期结果 * @return 行为 */ public Action ChangeBytes(final byte[] result) { return new ChangeBytesAction(result); } /** * Test method for {@link ConsoleManagerBizImpl#readLine()}. * * @throws IOException * 异常 */ @Test public void testReadLine() throws IOException { final InputStream origin = System.in; final InputStream mockStream = context.mock(InputStream.class); System.setIn(mockStream); context.checking(new Expectations() { { final byte[] b = new byte[8192]; oneOf(mockStream).read(b, 0, 8192); final byte[] result = new byte[8192]; result[0] = '1'; result[1] = '1'; result[2] = '\n'; will(ChangeBytes(result)); } }); Assert.assertEquals("11", biz.readLine()); System.setIn(origin); } /** * Test method for {@link ConsoleManagerBizImpl#writeLine(String)} */ @Test public void testWriteLine() { final String toWrite = "109-230-912-0"; biz.writeLine(toWrite); } }
3、mockaction
class ChangeBytesAction implements Action { private final byte[] result; /** * @param result * 结果 */ public ChangeBytesAction(final byte[] result) { this.result = result; } /* * (non-Javadoc) * * @see org.hamcrest.SelfDescribing#describeTo(org.hamcrest.Description) */ public void describeTo(final Description description) { description.appendText("change ").appendValueList("", ", ", "", result) .appendText(" value"); } /* * (non-Javadoc) * * @see org.jmock.api.Invokable#invoke(org.jmock.api.Invocation) */ public Object invoke(final Invocation invocation) throws Throwable { final byte[] bytesArray = (byte[]) invocation.getParametersAsArray()[0]; for (int i = 0; i < result.length; i++) { bytesArray[i] = result[i]; } return result.length; } }
4、如果在测试主体中使用System.out输出,则下面的代码可以对其进行测试
/** * Test method for {@link ConsoleManagerBizImpl#writeLine(String)} */ @Test public void testWriteLine() { final PrintStream origin = System.out; final PrintStream mockout = context.mock(PrintStream.class); System.setOut(mockout); final String toWrite = "109-230-912-0"; context.checking(new Expectations() { { oneOf(mockout).println(toWrite); } }); biz.writeLine(toWrite); System.setOut(origin); } }
相关推荐
jmock-1.0.1.jar jmock-1.0.1.jar
jmock-2.5.1.jar jmock-2.5.1.jar jmock-2.5.1.jar
Maven-Central / jmock / jmock-cglib 1.2.0 Maven-Central / org.apache.activemq / activemq-ra 5.2.05.1.0 Maven-Central / org.apache.maven.shared / maven-dependency-tree 1.21.1 Maven-Central / org.apache...
对Java平台中的Jmock测试方法进行了详细的介绍
jmock2.5.1.zip
java 隔离测试工具 特别适合service层的测试
java运行依赖jar包
NULL 博文链接:https://tristan-s.iteye.com/blog/1750265
用于项目测试,JMOCK,可以与JUNIT搭配进行测试
Spring提供了专门的测试模块用于简化单元测试和集成测试,单元测试和集成测试一般由程序员实现。
jmock-1.2.0-jars.rar
该文档详细介绍了junit单元测试用moke的使用方法. 在java TDD编程实践中是非常重要的资料。指的仔细阅读。
在 developerWorks 上面有一些关于 JUnit4 的文章,也有关于 JMock 的文章,但是结合这两项技术的文章基本上没有。...JUnit4 使用了 Java 5 注解让测试的过程变得更方便和灵活,因此备受开发者的青睐。
jmock-cglib-1.2.0.jar jmock-cglib-1.2.0.jar jmock-cglib-1.2.0.jar
不管是测试驱动开发或者是其它的开发模式,都会需要对代码进行单元测试,对于关联依赖关系少或者比较简单的类来说,直接使用JUnit就可以轻松的完成测试工作,但是对于关联到...在这里使用JMock来模拟那些不需要测试的类
JMock2.5.1和EasyMock3.0以及一些JUnit单元测试所需的jar,让你使用JMock和EasyMock时不用到处找相关的jar。
这个是几篇关于如何使用JMOCK对java代码测试,如果实在不清楚,也可咨询 445054051
jMock利用mock objects思想来对Java code进行测试。jMock具有以下特点:容易扩展,让你快速简单地定义mock objects,因此不必打破程序间的关联,让你定义灵活的超越对象之间交互作用而带来测试局限,减少你测试地脆弱...
jmock-2.4.0-jars.zip 此jar用于单元测试,功能非常强大,简化了单元测试和提高了单元测试的覆盖率和质量。
jmock可以模拟对象,常用于单元测试,与junit配合使用 jmock-2.5.1-javadoc