类ClassB中有如下的一个方法methodXXX,返回值为类ClassA的一个实例。public ClassA methodXXX () {    final ClassA classA = new ClassA();    ......
    return classA;}现在要测试类ClassB的方法methodXXX,类ClassA的实例在methodXXX中定义,类ClassB中没有ClassA实例的setter方法,请问高手如何用JMock虚拟ClassA来测试ClassB的方法methodXXX?分不够可以在给,谢谢!

解决方案 »

  1.   

    不是很明白LZ的测试目的
    要测试ClassB的methodXXX方法,那就是调用它以后得到的一个ClassA对象,然后asert这个对象是否和期待的对象一致就好了,为什么还要虚拟一个ClassA呢?
      

  2.   

    你好,是这样,如果ClassA的实例classA需要用到一些有依赖性的方法,比如链接服务器等等。
    虚拟测试就是要完全独立的测试,达到没有服务器环境也可以测试的目的。
    所以,ClassA需要虚拟。
      

  3.   

    你说的这是真实测试,JUnit就能实现。
    现在是想测试类ClassB的方法methodXXX,methodXXX方法里面用到了ClassA的实例。
    由于ClassA不能实现真实测试(比如环境不允许),这时候想测类ClassB的方法methodXXX,就要用JMock虚拟ClassA来实现。
      

  4.   

    mockery.checking(new Expectations(){
    {
      //Just Mock it
            }
    });
      

  5.   

    楼主的意思是否是这样:
    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());
     }
    }