【问题标题】:Unit Testing using Mockito or JMock使用 Mockito 或 JMock 进行单元测试
【发布时间】:2011-05-27 21:25:28
【问题描述】:

单元测试:

我有以下课程

public class BImpl extends AImpl
{
    public BImpl(final C c) 
    {
        super(c);
    }

    public String getInfo()
    {
       final String info = getInformation();
       // Do all my logic here
       return info;
    }
}

public abstract class AImpl
{
    public String getInformation()
    {
    // some logic...returns String.
    }
}

我正在尝试使用任何可用的 Mockito 或 JMock 模拟方法对方法 getInfo() 进行单元测试。

例如,当我使用 Mockito 时,我就是这样使用的:

final AImpl aImpl = mock(AImpl.class);
when(aImpl.getInformation()).thenReturn("ABC");

现在因为我必须创建一个 BImpl 的实例,所以我可以创建的唯一方法是使用可用的构造函数。

final BImpl bImpl = new BImpl (C);
bImpl.getInfo();

当它调用 getInfo() 方法并尝试调用 getInformation() 时,它不是调用模拟对象,而是调用实际对象。

什么是测试这种方法的好方法。 有没有其他方法可以创建 BImpl 的实例而无需通过我上面给出的构造函数?

谢谢!!

【问题讨论】:

  • 恐怕你的代码有好几层错误,很难给出实际的答案。它与 C 的用途有关。现在,代码无法编译,因为 AImpl 没有采用 C 的构造函数。
  • 我没有提到完整的 AImpl 类。但是 AImpl 类确实有需要的构造函数。

标签: unit-testing mockito jmock


【解决方案1】:

恕我直言,这不是模拟库的问题,而是您的设计问题。您想通过模拟它所依赖的getInformation() 来测试getInfo() 方法。对模拟所有依赖项的方法进行单元测试是正确的方法,所有模拟框架都很好地支持它。那么您为什么会遇到这些问题呢?

因为您选择了实际需要组合的继承。您滥用继承来实现 uses 关系,而它应该是组合的。从一个类继承只是为了方便地访问它的方法是自找麻烦。考虑通过每个存储库/DAO 扩展 EntityManager...

您应该首先重构您的代码,以便 BImpl 具有 AImpl 并以某种方式注入后者。然后你可以让一些 DI 框架在生产代码中执行注入(或自己做),同时在单元测试中注入模拟。

【讨论】:

  • 我明白你的意思,但这是一个糟糕的设计,已经存在了很长时间,现在无法更改。现在我将这个新方法 getInfo() 添加到其中,并且由于没有单元测试,我计划添加它,但这不允许我添加。我正在寻找一些替代方法来执行此操作,或者如果你们知道在不更改类的现有实现的情况下测试此方法的任何其他方法
  • 好的,我相信 Mockito 中的 spying 功能可能会对您有所帮助(请参阅我的 answer)。你必须监视getInformation()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
  • 2017-11-22
相关资源
最近更新 更多