Junit Mockito将SessionFactory模拟到DAO测试类中

时间:2018-10-30 13:55:33

标签: java unit-testing junit mockito

我是JUnit和Mockito的新手,我想在我的DAO测试类中模拟我的SessionFactory,这是我的工作方式:

@RunWith(MockitoJUnitRunner.class)
public class TodoDaoTest {
    @Mock 
    SessionFactory sessionFactory;

    @InjectMocks 
    TodoDao todoDao;

    @Mock
    Session session;
    @Mock
    Query query;


    @BeforeClass
    public static void setUpClass(){
    }

    @Before
    public void setUp(){
        Mockito.when(query.setParameter(any(int.class), any(Object.class))).thenReturn(query);
        Mockito.when(session.createQuery(any(String.class))).thenReturn(query);
        Mockito.when(sessionFactory.getCurrentSession()).thenReturn(session);
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void getTodosByUserIdShouldNotReturnNull(){
        User user = new User();
        assertNotNull(todoDao.getTodosByUserId(user.getId()));
    }
}

这是我的DAO课

@Component
@Transactional
public class TodoDao implements ITodoDao {

    @Autowired
    private SessionFactory sessionFactory;

    @Override
    @PostFilter("filterObject.userByUserId == authenticationFacade.getAuthenticatedFacade()")
    public List<Todo> getTodosByUserId(int userId) {
        List todos;
        todos = sessionFactory.getCurrentSession().createQuery("from Todo where userId = ?").setParameter(0, userId).list();
        return todos;
    }
}

但是运行测试时,我有一个java.lang.NullPointerException异常,nullPointerException在todos = sessionFactory.getCurrentSession().createQuery(...)行的水平上

2 个答案:

答案 0 :(得分:2)

在一个测试中,如果我将MockitoAnnotations.initMocks(this)放在Mockito.when(...).thenReturn(...)之后,我会得到NullPointerException

尝试先进行初始化,然后进行模拟。

我的理解是MockitoAnnotations.initMocks(this)初始化了存根依赖。然后,这允许在存根上设置when(...).thenReturn(...)行为。如果您尝试先设置行为,则依赖关系尚未初始化,因此会出现NullPointerException。

javadoc of mockito

中有一些描述

答案 1 :(得分:1)

.createQuery(“ from Todo where userId =?”)方法调用返回null。 您也应该设置模拟会话。