我是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。你也应该设置模拟会话。