类ClassB中有如下的一个方法methodXXX,返回值为类ClassA的一个实例。public ClassA methodXXX () { final ClassA classA = new ClassA(); ......
return classA;}现在要测试类ClassB的方法methodXXX,类ClassA的实例在methodXXX中定义,类ClassB中没有ClassA实例的setter方法,请问高手如何用JMock虚拟ClassA来测试ClassB的方法methodXXX?分不够可以在给,谢谢!
return classA;}现在要测试类ClassB的方法methodXXX,类ClassA的实例在methodXXX中定义,类ClassB中没有ClassA实例的setter方法,请问高手如何用JMock虚拟ClassA来测试ClassB的方法methodXXX?分不够可以在给,谢谢!
要测试ClassB的methodXXX方法,那就是调用它以后得到的一个ClassA对象,然后asert这个对象是否和期待的对象一致就好了,为什么还要虚拟一个ClassA呢?
虚拟测试就是要完全独立的测试,达到没有服务器环境也可以测试的目的。
所以,ClassA需要虚拟。
现在是想测试类ClassB的方法methodXXX,methodXXX方法里面用到了ClassA的实例。
由于ClassA不能实现真实测试(比如环境不允许),这时候想测类ClassB的方法methodXXX,就要用JMock虚拟ClassA来实现。
{
//Just Mock it
}
});
ClassA是一个低层的具体类,如像连接数据库并提供了一些方法供使用,在ClassB中,某些方法依赖ClassA的方法,测试时直接new ClassA是不能成功的,需要Mock.如果是这样,我想楼主首先重构下ClassB.
其次是:Jmock默认情况下是只支持接口的mock,不支持类的mock;
如果要mock一个具体的类,可以使用ClassImposteriser 来创建mock,但注意的是不能创建mocks为final类和final方法。示例(加入jmock-legacy.jar, cglib-nodep.jar ,objenesis.jar )public class ClassA { public String getStringVlaue(){
//查询数据库获取值
//String result = (retrieve DB);
String result = "Test";
return result;
}
}public class ClassB {
//提出classA实例,把使用methodXXX()的地方用classA替换
ClassA classA = new ClassA();
public ClassB(){
}
public ClassB(ClassA classA){
this.classA = classA;
}
public ClassA methodXXX(){
//...
return classA;
}
//classB中依赖classA的地方
public String getStringValue(){
//String value = methodXXX().getStringVlaue();
String value = classA.getStringVlaue();
value = value + " ClassB";
return value;
}
}import org.jmock.Expectations;
import org.jmock.Mockery;
import org.jmock.lib.legacy.ClassImposteriser;
import org.junit.BeforeClass;
import org.junit.Test;public class TestClassB { static Mockery context = null;
static ClassA classA = null;
static ClassB classB = null;
@BeforeClass
public static void setUp() throws Exception {
context = new Mockery() {{
setImposteriser(ClassImposteriser.INSTANCE);
}};
classA = context.mock(ClassA.class);
classB = new ClassB(classA);
}
@Test
public void testMethodXXX(){
context.checking(new Expectations(){
{
oneOf(classA).getStringVlaue();
will(returnValue("Test"));
}
});
assertEquals("Test ClassB", classB.getStringValue());
}
}