【发布时间】:2011-10-16 04:10:03
【问题描述】:
当我使用 EasyMock 和 Guice 框架编写测试时,我遇到了一个问题。代码如下:
class A {
B b;
@Inject
public A(B b) {
this.b = b;
this.b.addListener(this);
}
}
class ATest {
@Inject
A a;
B b;
class InjectionModule extends AbstractModule {
protected void configure() {
b = createMock(B.class);
bind(B.class).toInstance(b);
}
}
public void setUp() {
createInjector(new InjectionModule()).injectMembers(this);
}
public void testSomething() {
replay(b);
a.doSomething();
verify(b);
}
}
在ATest 中,我将 B 实现替换为模拟对象。但是当注入器创建一个 A 的实例时,B.addListener() 在A 的构造函数中被调用,不幸的是这个调用被 EasyMock 记录了,即使我没想到它也是如此。
因此,我的问题是 EasyMock 希望我在 ATest 的每个测试用例中调用 B.addListener()。请给我任何建议来克服这个问题。谢谢。
【问题讨论】:
-
最后,我放弃了 mock 框架。经过一周的工作,我使用继承来模拟类并用DI框架替换测试taret的实现。现在我的单元测试很容易写,也更清楚了。我相信 DI 框架的哲学适用于单元测试,它可以帮助我优雅地替换测试目标的实现。另一方面,mock 框架在单元测试时确实帮助了我,但它不像 mockito 那样强大并且有很多限制。
-
当DI和mock框架不能顺利协同工作时,我决定放弃mock框架。仅使用模拟框架时,其他人可能会觉得很有帮助。