浏览 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工具吗? 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2008-02-21
不能
|
|
| 返回顶楼 | |
|
最后更新时间:2008-02-21
抛出异常的爱 写道 不能 原理上行不通吗? |
|
| 返回顶楼 | |
|
最后更新时间:2008-02-21
nowind 写道 抛出异常的爱 写道 不能 原理上行不通吗? 你认为把不同的逻辑放一起你的脑力能跟踪的过来么 而且......你可以把f2 f3想要返回值用mock模拟出来的. |
|
| 返回顶楼 | |
|
最后更新时间: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()
就可以省很多代码,结构也清楚了很多。 |
|
| 返回顶楼 | |
|
最后更新时间:2008-02-21
原理上当然可以,主要是你想怎么mock法.把他清空比较简单
|
|
| 返回顶楼 | |
|
最后更新时间:2008-02-21
哈哈,原来easymock自己已经提供了。
在easymock classextension中,通过 EasyMock.createMock(class, mockedMethods)方法得到的mock类,它的没有被mocked的方法,还是它自身的方法。与我希望的是一样的。 |
|
| 返回顶楼 | |
|
最后更新时间:2008-02-21
nowind 写道 哈哈,原来easymock自己已经提供了。
在easymock classextension中,通过 EasyMock.createMock(class, mockedMethods)方法得到的mock类,它的没有被mocked的方法,还是它自身的方法。与我希望的是一样的。 应该可以的,毕竟mock的原理也是基于反射和动态代理,理论上 可以做到 |
|
| 返回顶楼 | |
|
最后更新时间: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! 要是你发现你的类测试起来很不方便的话,还是老老实实重构吧。 |
|
| 返回顶楼 | |
|
最后更新时间:2008-02-22
被测试类(object under test)和Mock对象重合了,你应该试图重构一下你的类了
|
|
| 返回顶楼 | |










