`

使用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

    3. **处理不可预知的外部行为**:对于依赖于网络、数据库或其他不可控因素的组件,JMock可以提供模拟行为,确保测试的可重复性和稳定性。 **JMock的实现步骤** 1. **创建模拟对象**:使用JMock API创建一个模拟...

    jmock2.5.1.zip

    在实际应用中,jMock常与其他测试框架如JUnit、TestNG等配合使用,通过它们的注解功能将模拟对象和测试用例紧密结合起来。同时,jMock也可以与EasyMock等其他模拟框架协同工作,提供更丰富的测试策略。 总结来说,...

    JMock

    JMock可以轻松地与JUnit、TestNG等测试框架结合使用。在JUnit中,通常会在`@Before`方法中创建模拟对象,`@Test`方法中设置期望和验证,然后在`@After`方法中清理。 ### 源码分析 JMock的源码阅读可以帮助理解其...

    jmock jar包及doc文档

    在IT行业中,单元测试和集成测试是软件开发过程中的重要环节,确保代码的质量和稳定性。Spring框架为了方便开发者进行...深入理解和使用JMock及相关的测试框架,对于提升开发者的专业技能和项目成功率具有重要意义。

    jmock-1.1.0.jar

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

    JMOCK-2.6.0

    JUNIT作为最流行的Java单元测试框架之一,提供了丰富的断言和测试结构。通过JMOCK,我们可以编写出更加灵活和强大的测试用例。例如,可以使用JMOCK的expectations来定义对象行为,然后在JUNIT的@Test注解的测试方法...

    jmock-2.6.0.jar

    java运行依赖jar包

    JMOCK使用文档

    @RunWith(JMock.class) public class MyTestClass { @Test public void testMyMethod() { Mockery context = new Mockery(); MyDependency mockDependency = context.mock(MyDependency.class); context....

    jmock-1.2.0-jars.rar

    在 JUnit 中,你可以使用 `jmock-junit3` 或 `jmock-junit4` 包,它们提供了一个 JUnit Rule,使得在测试类中使用 JMock 更加方便。 6. **版本信息** 这个压缩包中的 "jmock-1.2.0-jars" 提供的是 JMock 1.2.0 ...

    jmock-1.2.0-jars.zip

    JMock是一款强大的Java模拟对象测试工具,它允许开发者创建和控制模拟对象,从而对代码进行详尽的测试。 JMock-1.2.0-jars.zip是一个包含JMock核心库和CGLIB扩展库的压缩包。这个压缩包中的两个主要文件——jmock-...

    Jmock2.6 jar包

    import org.jmock.Mockery; import org.junit.Test; public class MyServiceTest { @Test public void testDoSomething() { Mockery context = new Mockery(); final MyDependency mockDependency = context....

    jmock-2.4.0-jars.zip

    总结来说,jMock 2.4.0-jars.zip是提高单元测试效率和质量的重要工具,通过其强大的模拟和验证功能,开发者可以编写出更加健壮的测试代码,确保软件的稳定性和可靠性。对于任何希望优化测试流程的Java开发团队而言,...

    jmock-2.6.0-jars

    `jmock`是Java平台上的一个模拟框架,它允许开发者在单元测试中创建和控制对象的行为,以便能够隔离测试并精确地指定期望的交互。下面我们将深入探讨`jmock`的关键概念和功能。 ### 1. 模拟框架概述 `jmock`属于...

    jMock基本使用方法

    import org.jmock.MockObjectTestCase; public class UserServiceTest extends MockObjectTestCase { private UserService userService = new UserServiceImpl(); private Mock userDAO = null; public ...

    软件测试资料集合,jtest,jmock

    `j-testng-sample.zip`可能是一个包含`TestNG`测试框架示例的压缩包,`TestNG`是另一种流行的Java测试框架,提供了更高级的功能,如并行测试、配置方法和测试套件。通过这个样本,开发者可以学习如何使用`TestNG`来...

Global site tag (gtag.js) - Google Analytics