`

使用jmock测试System.in和System.out

    博客分类:
  • TDD
阅读更多

本文要求读者已具备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-1.0.1.jar

    jmock-2.5.1.jar

    jmock-2.5.1.jar jmock-2.5.1.jar jmock-2.5.1.jar

    jmock-1.2.0.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...

    jmock-overview.rar_overview

    对Java平台中的Jmock测试方法进行了详细的介绍

    jmock2.5.1.zip

    jmock2.5.1.zip

    jmock-1.1.0.jar

    java 隔离测试工具 特别适合service层的测试

    jmock-2.6.0.jar

    java运行依赖jar包

    JMock

    NULL 博文链接:https://tristan-s.iteye.com/blog/1750265

    JMOCK-2.6.0

    用于项目测试,JMOCK,可以与JUNIT搭配进行测试

    jmock jar包及doc文档

    Spring提供了专门的测试模块用于简化单元测试和集成测试,单元测试和集成测试一般由程序员实现。

    jmock-1.2.0-jars.rar

    jmock-1.2.0-jars.rar

    jMock Cookbook 中文版.doc

    该文档详细介绍了junit单元测试用moke的使用方法. 在java TDD编程实践中是非常重要的资料。指的仔细阅读。

    JUnit4 与 JMock 之双剑合璧.doc

    在 developerWorks 上面有一些关于 JUnit4 的文章,也有关于 JMock 的文章,但是结合这两项技术的文章基本上没有。...JUnit4 使用了 Java 5 注解让测试的过程变得更方便和灵活,因此备受开发者的青睐。

    jmock-cglib-1.2.0.jar

    jmock-cglib-1.2.0.jar jmock-cglib-1.2.0.jar jmock-cglib-1.2.0.jar

    jmock-1.0.1-src.zip_单元测试

    不管是测试驱动开发或者是其它的开发模式,都会需要对代码进行单元测试,对于关联依赖关系少或者比较简单的类来说,直接使用JUnit就可以轻松的完成测试工作,但是对于关联到...在这里使用JMock来模拟那些不需要测试的类

    jmock2.5.1和easymock3.0

    JMock2.5.1和EasyMock3.0以及一些JUnit单元测试所需的jar,让你使用JMock和EasyMock时不用到处找相关的jar。

    JMOCK使用文档

    这个是几篇关于如何使用JMOCK对java代码测试,如果实在不清楚,也可咨询 445054051

    jmock-2.5.1-jars.zip

    jMock利用mock objects思想来对Java code进行测试。jMock具有以下特点:容易扩展,让你快速简单地定义mock objects,因此不必打破程序间的关联,让你定义灵活的超越对象之间交互作用而带来测试局限,减少你测试地脆弱...

    jmock-2.4.0-jars.zip

    jmock-2.4.0-jars.zip 此jar用于单元测试,功能非常强大,简化了单元测试和提高了单元测试的覆盖率和质量。

    jmock-2.5.1-javadoc

    jmock可以模拟对象,常用于单元测试,与junit配合使用 jmock-2.5.1-javadoc

Global site tag (gtag.js) - Google Analytics