Junit Mockito将MockSessionFactory移植到DAO测试类中



我是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(...)行的级别

在我当前打开的测试中,如果我将MockitoAnnotations.initMocks(this)放在Mockito.when(...).thenReturn(...)之后,我将获得NullPointerException

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

我的理解是MockitoAnnotations.initMocks(this)初始化存根依赖关系。这样就允许在短截线上设置when(...).thenReturn(...)行为。如果您尝试先设置行为,那么依赖项尚未初始化,因此会出现NullPointerException。

mockito 的javadoc中有一些描述

.createQuery("from Todo where userId?"(方法调用返回null。你也应该设置模拟会话。

最新更新