Как смоделировать метод абстрактного класса? - PullRequest
0 голосов
/ 30 октября 2019

Мне нужно протестировать класс, который расширяет абстрактный класс и использует его защищенный метод. Вот код:

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

, а вот код абстрактного класса:

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

Теперь, как мне написать модульный тест для DataDaoImpl и смоделировать сеанс в Session session = 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() терпит неудачу.

1 Ответ

2 голосов
/ 30 октября 2019

Когда DataDaoImpl расширяется SuperDao, метод getCurrentSession неотъемлемо становится частью DataDaoImpl, и вам следует избегать насмешек над тестируемым классом.

Что вам нужно сделать, это макет SessionFactory и вернуть смоделированный объект при вызове sessionFactory.getCurrentSession(). При этом getCurrentSession в DataDaoImpl вернет макет объекта.

Надеюсь, это поможет.

...