Unit testing 使用Mockito或JMock进行单元测试

Unit testing 使用Mockito或JMock进行单元测试,unit-testing,mockito,jmock,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; } } pub

单元测试:

我有以下课程

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


谢谢

IMHO模拟库不是问题,而是设计的问题。您想通过模拟它所依赖的
getInformation()
来测试
getInfo()
方法。单元测试模拟所有依赖项的方法是一种正确的方法,所有模拟框架都非常支持它。那么你为什么会遇到这些问题呢

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


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

我确实理解您的意思,但这是一个糟糕的设计,已经存在了很长时间,现在无法更改。现在我将这个新方法getInfo()添加到它中,因为没有单元测试,所以我计划添加它,但这不允许我这么做。我正在寻找一些替代方法来实现这一点,或者如果你们知道任何其他方法来测试这个方法而不改变classesOK的现有实现,我相信Mockito中的间谍功能可能会对你们有所帮助(参见我的文章)。你必须监视
getInformation()
。恐怕你的代码中有几层错误,很难给出实际的答案。这与C的用途有关。现在,代码不会编译,因为AImpl没有接受C的构造函数。我没有提到完整的AImpl类。但是AImpl类确实具有所需的构造函数。