单元测试:
我有以下课程
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实例而不用上面给出的构造函数?
谢谢!
答案 0 :(得分:2)
恕我直言,这不是模拟图书馆的问题,而是你的设计。您希望通过模拟它所依赖的getInfo()
来测试getInformation()
方法。单元测试一个模拟其所有依赖项的方法是一种正确的方法,所有模拟框架都能很好地支持它。那么为什么你会遇到这些问题?
因为您选择了实际需要合成的继承。您滥用继承来实现使用关系,而它应该是组合。从类中继承只是为了方便地访问它的方法是一个麻烦。考虑通过每个存储库/ DAO扩展EntityManager
...
您应首先重构代码,以便BImpl
具有 AImpl
,并以某种方式注入后者。然后你可以让一些DI框架在生产代码中执行注入(或者自己动手),同时在单元测试中注入mock。