Я создал специальный applicationContext-test.xml, чтобы использовать его в моих тестовых классах.
ApplicationContext-test.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd">
<context:property-placeholder location="classpath:db/database.properties"/>
<context:annotation-config />
<!-- DATASOURCE -->
<jdbc:embedded-database id="h2dataSource" type="H2">
<jdbc:script location="classpath:db/sql/create-db.sql" />
<jdbc:script location="classpath:db/sql/insert-data.sql" />
</jdbc:embedded-database>
<!-- SESSION FACTORY -->
<bean id="testSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="h2dataSource"/>
<property name="packagesToScan" value="com.medkhelifi.tutorials.todolist.models.entities"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect"> ${hibernate.dialect} </prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<!-- MUST have transaction manager, using aop and aspects -->
<bean id="testTransactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="testSessionFactory" />
</bean>
<tx:annotation-driven transaction-manager="testTransactionManager" />
</beans>
Теперь я хочу использовать мой testSessionFactory
в качестве бина с автопроводкой и вводить его в мои макеты.
TodoDaoTest.java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration (value = "classpath:/conf/applicationContext-test.xml")
public class TodoDaoTest {
@Autowired
@Mock
SessionFactory testSessionFactory;
@InjectMocks
TodoDao todoDao;
private boolean mockInitialized = false;
@Before
public void setUp(){
if(!mockInitialized) {
MockitoAnnotations.initMocks(this);
mockInitialized = true;
}
}
@Test
public void getTodosByUserIdShouldNotReturnNull(){
User user = new User();
assertNotNull(todoDao.getTodosByUserId(user.getId()));
}
}
Это мой класс TodoDao
TodoDao.java
@Component
@Transactional
public class TodoDao implements ITodoDao {
@Autowired
private SessionFactory sessionFactory;
@Autowired
private AuthenticationFacade authenticationFacade;
@Override
@PostFilter("filterObject.userByUserId == authenticationFacade.getAuthenticatedFacade()")
public List<Todo> getTodosByUserId(int userId) {
List todos;
// this is line 30
todos = sessionFactory.getCurrentSession().createQuery("from Todo where userId = ?").setParameter(0, userId).list(); // this is line 30
return todos;
}
}
Когда я выполняю свой тестовый метод, я получаю java.lang.NullPointerException
at com.medkhelifi.tutorials.todolist.models.dao.TodoDao.getTodosByUserId(TodoDao.java:30)
в строке 30 (как показано в классе TodoDao.java)
Я не знаю, пропустил ли я что-то.