论坛首页 Java版

有这样的mock工具吗?只mock其中的某个方法,其它的不变

浏览 654 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2008-02-21 关键字: mock
希望在mock一个类时,可以有选择的mock其中的若干个方法,而其它的方法不变。而不像EasyMock那样,mock一个类时,它的所有方法都变成空的了。

我期的代码如下:

// 原有class
class A {
    public String f1() { return "f1" }
    public String f2() { return "f2" }
    public String f3() { return "f3" }
}

A a = createMock(A.class);
expect(clsA.f1()).andReturn("mock f1");

replay();
a.f1();  // -> mock f1

// 关键在下面两行
a.f2();  // -> f2
a.f3();  // -> f3

verify();



不知道有这样的mock工具吗?
   
最后更新时间:2008-02-21
不能
   
0 请登录后投票
最后更新时间:2008-02-21
抛出异常的爱 写道
不能
   

原理上行不通吗?
   
0 请登录后投票
最后更新时间:2008-02-21
nowind 写道
抛出异常的爱 写道
不能
   

原理上行不通吗?

你认为把不同的逻辑放一起你的脑力能跟踪的过来么
而且......你可以把f2 f3想要返回值用mock模拟出来的.
   
0 请登录后投票
最后更新时间:2008-02-21
这个问题,其实是对我另一个帖子中提出的问题的一种假想解决方法:

主题:这种情况,用mock进行单元测试怎么写

假设有以下这个类
class A {
    String f1() { ... }
    String f2() { ... }
    String f3() { ... }
    public void run() {
       if(f1().equals("xx")) {
          ... return
       }
       if(f2().equals("xx")) {
          ... return
       }
       if(f3().equals("xx")) {
          ... return
       } 
    }
}


假设我已经把f1(),f2(),f3()这三个类都测试了,现在需要测试run()方法

我的做法是:
class MockA extends A {
    String f1() { ... }
}

然后测试 new MockA().run()




class MockA extends A {
    String f1() { ... }
    String f2() { ... }
}

再测试 new MockA().run()



总之要写很多子类,很麻烦。

如果有简单的方法只覆写某个方法,我只需要:
MockA a = createMock(A.class);
expect(a.f1()).andReturn("new f1");
测试 a.run()

再
expect(a.f2()).andReturn("new f2");
再测试 a.run()


就可以省很多代码,结构也清楚了很多。
   
0 请登录后投票
最后更新时间:2008-02-21
原理上当然可以,主要是你想怎么mock法.把他清空比较简单
   
0 请登录后投票
最后更新时间:2008-02-21
哈哈,原来easymock自己已经提供了。

在easymock classextension中,通过
EasyMock.createMock(class, mockedMethods)方法得到的mock类,它的没有被mocked的方法,还是它自身的方法。与我希望的是一样的。
   
0 请登录后投票
最后更新时间:2008-02-21
nowind 写道
哈哈,原来easymock自己已经提供了。

在easymock classextension中,通过
EasyMock.createMock(class, mockedMethods)方法得到的mock类,它的没有被mocked的方法,还是它自身的方法。与我希望的是一样的。

应该可以的,毕竟mock的原理也是基于反射和动态代理,理论上
可以做到
   
0 请登录后投票
最后更新时间:2008-02-21
nowind 写道
哈哈,原来easymock自己已经提供了。

在easymock classextension中,通过
EasyMock.createMock(class, mockedMethods)方法得到的mock类,它的没有被mocked的方法,还是它自身的方法。与我希望的是一样的。

classextension和gc有冲突。如果你的测试程序碰巧运行了gc,它会抱怨unexpected finalize() call。

何况,它对final class, final method都无能为力。不但无能为力,它还装作没事人一样,直到你的测试莫名其妙的失败,然后让维护者花几个小时找bug,最后发现就是一个method改成final了。

所以,强烈反对classextension!

要是你发现你的类测试起来很不方便的话,还是老老实实重构吧。
   
0 请登录后投票
最后更新时间:2008-02-22
被测试类(object under test)和Mock对象重合了,你应该试图重构一下你的类了
   
0 请登录后投票
论坛首页 Java版

跳转论坛:
JavaEye推荐