Since I've recently dived into developing with MyBatis, I also started doing unit-test for my library.
I was ignored by two facts
I was ignored by two facts
- The test ran really slow. Like 1 sec pr. test
- My data changed during the day - testing in a shared test-environment
So I sat down and read some of the MyBatis source code for the classes I use. And found out I just needed to create two Mock classes and I would be good. So I did, following is the code, some of the methods for implementation was removed since they only throw a "UnsupportedOperationException":
MockSqlSession
package com.zylinc.zydata.mybatis.mocking; import org.apache.ibatis.session.SqlSession; /** * * @author Nicolai Willems */ class MockSqlSession implements SqlSession { public void close() { // Do nothing // Maybee destruct object // Naah who cares?? } publicT getMapper(Class type) { String mockClass, interfaceName, packageName, mockClassName; Class typeToInstantiate; T result = null; interfaceName = type.getName(); int lastIndex = interfaceName.lastIndexOf('.')+1; // Plus one to get of the '.' again packageName = interfaceName.substring(0, lastIndex); mockClassName = interfaceName.substring(lastIndex); if(mockClassName.startsWith("I")){ mockClassName = mockClassName.substring(1); } mockClassName = "Mock"+mockClassName; mockClass = packageName+mockClassName; try{ typeToInstantiate = Class.forName(mockClass); result = (T)typeToInstantiate.newInstance(); }catch(ClassNotFoundException e){ System.out.println("Class not found: "+e.getMessage()); System.out.println("Cause was: "+e.getCause().toString()); e.printStackTrace(System.out); }catch(InstantiationException e){ System.out.println("Class instantiation failed: "+e.getMessage()); System.out.println("Cause was: "+e.getCause().toString()); e.printStackTrace(System.out); }catch(IllegalAccessException e){ System.out.println("Illegal Access exception: "+e.getMessage()); System.out.println("Cause was: "+e.getCause().toString()); e.printStackTrace(System.out); } return result; } }
MockSqlSessionFactory
For readability I have removed all of the other openSession-methods, since they just do "return this.openSession();"
package com.zylinc.zydata.mybatis.mocking; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; /** * * @author Nicolai Willems */ public class MockSqlSessionFactory implements SqlSessionFactory { private Configuration configuration; public SqlSession openSession() { return new MockSqlSession(); } public Configuration getConfiguration() { return this.configuration; //throw new UnsupportedOperationException("Not supported yet."); } }
If you have any questions felle free to contact me, either in the comments field or on the MyBatis user list.
1 comment:
You need to look into JMock - no need to write "real" Mock objects
Post a Comment