使用Mockito或JMock进行单元测试

时间:2011-05-27 21:25:28

标签: unit-testing mockito jmock

单元测试:

我有以下课程

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实例而不用上面给出的构造函数?

谢谢!

1 个答案:

答案 0 :(得分:2)

恕我直言,这不是模拟图书馆的问题,而是你的设计。您希望通过模拟它所依赖的getInfo()来测试getInformation()方法。单元测试一个模拟其所有依赖项的方法是一种正确的方法,所有模拟框架都能很好地支持它。那么为什么你会遇到这些问题?

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

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