我是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(...)
行的水平上
答案 0 :(得分:2)
在一个测试中,如果我将MockitoAnnotations.initMocks(this)
放在Mockito.when(...).thenReturn(...)
之后,我会得到NullPointerException
。
尝试先进行初始化,然后进行模拟。
我的理解是MockitoAnnotations.initMocks(this)
初始化了存根依赖。然后,这允许在存根上设置when(...).thenReturn(...)
行为。如果您尝试先设置行为,则依赖关系尚未初始化,因此会出现NullPointerException。
答案 1 :(得分:1)
.createQuery(“ from Todo where userId =?”)方法调用返回null。 您也应该设置模拟会话。