繁体   English   中英

如何模拟抽象 class 方法?

[英]How to mock Abstract class method?

我需要测试一个 class 扩展抽象 class 并使用它受保护的方法。 这是代码:

public class DataDaoImpl extends SuperDao<CustomClass> 
{
   public List<Long> findAllbyId(Long productId)
   {
      Session session = getCurrentSession();
      .......
      //Rest of code
   }
}

这是抽象class的代码:

public abstract class SuperDao<T>
{
    protected final Session getCurrentSession() 
     {  
       return sessionFactory.getCurrentSession();
     }
}

现在我应该如何为DataDaoImpl编写单元测试并且应该在Session session = getCurrentSession(); ?

我在 Stackoverflow 上尝试了不同的解决方案,但我仍然无法模拟它并获得 session 模拟。

我已经尝试使用 mocking getcurrentSession()按照以下代码回答中的建议:

@Test
public void testDataDaoImpl()
{
SessionFactory mockedSessionFactory = Mockito.mock(SessionFactory.class);
Session mockedSession = Mockito.mock(Session.class); 
Mockito.when(mockedSessionFactory.getCurrentSession()).thenReturn(mockedSession);   
DataDaoImpl DDI_Instance = new DataDaoImpl((long) 120);
DDI_Instance.findAllbyId(Long productId);
}

但是session.getCurrentSession()仍然失败。

由于DataDaoImpl扩展SuperDao ,方法getCurrentSession固有地成为DataDaoImpl的一部分,您应该避免 mocking 被测试的 class 。

您需要做的是,模拟SessionFactory并在调用sessionFactory.getCurrentSession()时返回模拟的 object。 使用DataDaoImpl中的getCurrentSession将返回模拟的 object。

希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM