本文要求读者已具备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...
3. **处理不可预知的外部行为**:对于依赖于网络、数据库或其他不可控因素的组件,JMock可以提供模拟行为,确保测试的可重复性和稳定性。 **JMock的实现步骤** 1. **创建模拟对象**:使用JMock API创建一个模拟...
在实际应用中,jMock常与其他测试框架如JUnit、TestNG等配合使用,通过它们的注解功能将模拟对象和测试用例紧密结合起来。同时,jMock也可以与EasyMock等其他模拟框架协同工作,提供更丰富的测试策略。 总结来说,...
JMock可以轻松地与JUnit、TestNG等测试框架结合使用。在JUnit中,通常会在`@Before`方法中创建模拟对象,`@Test`方法中设置期望和验证,然后在`@After`方法中清理。 ### 源码分析 JMock的源码阅读可以帮助理解其...
在IT行业中,单元测试和集成测试是软件开发过程中的重要环节,确保代码的质量和稳定性。Spring框架为了方便开发者进行...深入理解和使用JMock及相关的测试框架,对于提升开发者的专业技能和项目成功率具有重要意义。
java 隔离测试工具 特别适合service层的测试
JUNIT作为最流行的Java单元测试框架之一,提供了丰富的断言和测试结构。通过JMOCK,我们可以编写出更加灵活和强大的测试用例。例如,可以使用JMOCK的expectations来定义对象行为,然后在JUNIT的@Test注解的测试方法...
java运行依赖jar包
@RunWith(JMock.class) public class MyTestClass { @Test public void testMyMethod() { Mockery context = new Mockery(); MyDependency mockDependency = context.mock(MyDependency.class); context....
在 JUnit 中,你可以使用 `jmock-junit3` 或 `jmock-junit4` 包,它们提供了一个 JUnit Rule,使得在测试类中使用 JMock 更加方便。 6. **版本信息** 这个压缩包中的 "jmock-1.2.0-jars" 提供的是 JMock 1.2.0 ...
JMock是一款强大的Java模拟对象测试工具,它允许开发者创建和控制模拟对象,从而对代码进行详尽的测试。 JMock-1.2.0-jars.zip是一个包含JMock核心库和CGLIB扩展库的压缩包。这个压缩包中的两个主要文件——jmock-...
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是提高单元测试效率和质量的重要工具,通过其强大的模拟和验证功能,开发者可以编写出更加健壮的测试代码,确保软件的稳定性和可靠性。对于任何希望优化测试流程的Java开发团队而言,...
`jmock`是Java平台上的一个模拟框架,它允许开发者在单元测试中创建和控制对象的行为,以便能够隔离测试并精确地指定期望的交互。下面我们将深入探讨`jmock`的关键概念和功能。 ### 1. 模拟框架概述 `jmock`属于...
`j-testng-sample.zip`可能是一个包含`TestNG`测试框架示例的压缩包,`TestNG`是另一种流行的Java测试框架,提供了更高级的功能,如并行测试、配置方法和测试套件。通过这个样本,开发者可以学习如何使用`TestNG`来...
import static org.jmock.Expectations.*; import org.junit.Test; import org.jmock.Mockery; public class MyTest { private Mockery context = new Mockery(); @Test public void testMyMethod() { final ...