2015-11-26 2 views
2

Я новичок в Spring и JPA. Я разработал проект с использованием Spring4, весеннего планировщика и JPA, и теперь я хочу проверить свой код с помощью тестов Junit. Я начал с тестирования своих методов DAO. Вот исходный код:Entity Manager null каждый раз при запуске тестов Junit

Этот класс делает запуск задачи для планировщика

public class TriggerTask { 


@Autowired 
private TriggerDaoBean triggerDaoBean; 

public void executeDailyTask() { 

    try{ 
    List<User> users=triggerDaoBean.getClients(); 
    if (null != users && users.size()>0){ 

     //do some task 
    } 

    }catch(Exception e){ 

    } 
}} 

дао боб:

@Stateless 
public class TriggerDaoBean implements Serializable { 

    private static final long serialVersionUID = 1L; 


    @PersistenceContext 
    private EntityManager em; 

    public List<User> getUsers() {  
     List<User> userList = new ArrayList<User>();    
     Query query = em.createQuery(
       "SELECT user FROM USER user"); 
     userList = (List<User>)query.getResultList(); 
     if (null != userList && userList.size() > 0) { 
      return userList; 
     } else { 
      return null; 
     } 
    } 

    .... 
} 

я написал ниже тестовый пример:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "/spring-quartz-test.xml" }) 
@TransactionConfiguration(defaultRollback=true) 
@Transactional 
public class TriggerTest { 

    @Autowired 
    TriggerDaoBean triggerDaoBean; 

    @Test 
    public void getUserListTest() {  
     triggerDaoBean.getUsers(); 
    } 
} 

Содержание весенне-кварцевого теста.xml выглядит следующим образом:

<bean id="triggerTask" class="com.test.service.TriggerTask"> 
    <property name="triggerDaoBean" ref="triggerDaoBean"/> 
</bean> 

<bean id="triggerDaoBean" 
    class="com.test.service.TriggerDaoBean"> 
</bean> 

<bean id="runsrJobDaily" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
    <property name="targetObject" ref="triggerTask" /> 
    <property name="targetMethod" value="executeDailyTask" /> 
</bean> 

И persistence.xml выглядит следующим образом:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="forge-default" transaction-type="JTA" > 
    <description>Forge Persistence Unit</description> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <jta-data-source>java:/MySqlDS</jta-data-source> 


    <class>com.test.persistence.entity.User</class> 

    <properties> 
    <!-- <property name="hibernate.hbm2ddl.auto" value="create-drop"/> --> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> 
     <!-- 
     <property name="hibernate.ejb.cfgfile" value="modified.hibernate.cfg.xml"/> 
     --> 
     <property name="hibernate.show_sql" value="true"/> 
     <property name="hibernate.format_sql" value="true"/> 
     <property name="hibernate.transaction.flush_before_completion" value="true"/> 
    </properties> 

    </persistence-unit> 
</persistence> 

java:/MySqlDS это имя JNDI из источника данных. Каждый раз, когда я запускаю свой тест, NullPointerException приходит для EntityManager.

Я что-то не так?

ответ

0

Вы должны определить свой EntityManager весной, я не вижу EntityManager в коде вы в курсе, что вы можете сделать это таким образом

<tx:annotation-driven transaction-manager="txManager"/> 

<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="persistenceUnitName" value="example" /> 
</bean> 

<bean id="entityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 

Знайте, что ваши определяют тип сделки, как JTA в persistence.xml, действительно вам нужны глобальные транзакции? если нет, удалите transaction-type="JTA" в persistence.xml

Другое дело, для целей тестирования было бы лучше использовать тестовую базу данных, такую ​​как H2. Вы можете определить его в весеннем контексте теста внутри src/test/resources

<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="persistenceXmlLocation" value="classpath:META-INF/persistence-test.xml"/> 
     <property name="persistenceUnitName" value="example-test" /> 
     <property name="dataSource" ref="dataSourceTest"/> 
</bean> 

<bean id="entityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 

<bean id="dataSourceTest" class="org.springframework.jdbc.datasource.SimpleDriverDataSource"> 
     <property name="driverClass" value="org.h2.Driver"/> 
     <property name="url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE"/> 
     <property name="username" value="sa"/> 
     <property name="password" value=""/> 
</bean> 

<bean id="org.h2.tools.Server-WebServer" class="org.h2.tools.Server" 
     factory-method="createWebServer" init-method="start" lazy-init="true"> 
     <constructor-arg value="-web,-webAllowOthers,-webPort,11111" /> 
</bean> 

Таким образом, вы можете контролировать состояние базы данных, каждый тест будет создать базу данных в памяти, вы можете определить import.sql в src/test/resource для того, чтобы заполнить таблицы с помощью теста данные. Вы должны добавить зависимость h2 от pom.xml

<dependency> 
    <groupId>com.h2database</groupId> 
    <artifactId>h2</artifactId> 
    <version>1.3.174</version> 
    <scope>test</scope> 
</dependency> 
Смежные вопросы