【问题标题】:Mock framework works with dependency injection framework in unit test模拟框架在单元测试中与依赖注入框架一起使用
【发布时间】: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框架。仅使用模拟框架时,其他人可能会觉得很有帮助。

标签: guice easymock roboguice


【解决方案1】:

我认为问题在于您正在尝试使用 DI 框架对类进行单元测试(这总是很痛苦)。

您为什么不自己实例化 A 并在此过程中删除 8 行代码?

【讨论】:

  • 因为您经常可以使用 DI 框架来简化大型代码库的模拟过程。
猜你喜欢
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 2012-03-14
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 2011-05-16
相关资源
最近更新 更多