【问题标题】:Mock methods not directly called in unit test with JMock使用 JMock 在单元测试中不直接调用的模拟方法
【发布时间】:2012-02-07 17:27:58
【问题描述】:

我有一个正在测试的方法。在它的调用堆栈中,它调用一个 DAO,实习生使用 JDBC 与 DB 聊天。我对知道 JDBC 层会发生什么并不真正感兴趣。我已经对此进行了测试,而且效果非常好。

我正在尝试使用 DAO 层的 JMock 进行模拟,因此我可以专注于测试这个方法的细节。这是我所拥有的基本表示。

@Test    
public void myTest()
{
     context.checking(new Expectations() {
          {
               allowing(myDAO).getSet(with(any(Integer.class)));
               will(returnValue(new HashSet<String>()));
          }
     });

    // Used only to show the mock is working but not really part of this test.
    // These asserts pass.
    Set<String> temp = myDAO.getSet(Integer.valueOf(12));
    Assert.assertNotNull(temp);
    Assert.assertTrue(temp.isEmpty());

    MyTestObject underTest = new MyTestObject();
    // Deep in this call MyDAO is initialized and getSet() is called.
    // The mock is failing to return the Set as desired. getSet() is run as 
    // normal and throws a NPE since JDBC is not (intentionally) setup. I want 
    // getSet() to just return an empty set at this layer.
    underTest.thisTestMethod();
    ...
    // Other assertions that would be helpful for this test if mocking 
    // was working.
}

根据我创建此测试的经验,我无法使用 JMock 模拟间接对象。或者我没有看到关键点。我希望下半场是真的。

想法,谢谢。

【问题讨论】:

    标签: junit jmock


    【解决方案1】:

    从 sn-p 中,我猜测 MyTestObject 使用反射或静态方法或字段来获取 DAO,因为它没有构造函数参数。 JMock 不会按类型替换对象(现在任何时候都会有很多人推荐其他框架这样做)。

    这是故意的。 JMock 的一个目标是通过要求干净的依赖关系和集中的行为来突出对象设计的弱点。我发现在域对象中隐藏 DAO/JDBC 访问最终会给我带来麻烦。这意味着域对象具有秘密的依赖关系,这使得它们更难理解和改变。我更喜欢在代码中明确说明这些关系。

    因此,您必须以某种方式将模拟对象放入目标代码中。如果您不能或不想这样做,那么您将不得不使用另一个框架。

    附:一点风格,可以稍微简化一下这个测试:

    context.checking(new Expectations() {{
      allowing(myDAO).getSet(12); will(returnValue(new HashSet<String>()));
    }});
    

    在测试中,您应该真正了解期望的值并将其输入到期望中。这样可以更轻松地查看对象之间的值流。

    【讨论】:

    • 在 setUp() 中,我使用 context.mock(MyDAO.class) 模拟 myDAO。在 MyTestObject 的互通中,MyDAO 被实例化为 'new'。
    • 那就是问题所在。你有一个我们看不到的隐式依赖。您现在必须决定是要明确该依赖关系还是使用更聪明的框架之一进行干预。我想你可以猜到我更喜欢哪一个:)
    • 我们改用 JMockit,但也考虑将 PowerMock 添加到选项中。
    • 我认为你有点没抓住重点,但还是祝你好运
    猜你喜欢
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    相关资源
    最近更新 更多