2017-04-21 49 views
0

我開發了一個使用Hibernate的項目。我試圖用內存數據庫中的H2使用Junit來測試它,但測試用例是在我使用它進行開發的數據庫中創建字段。 這裏是我的代碼:Hibernate Junit H2在內存數據庫測試用例中更改開發數據庫db

UserDAO.java

public interface UserDAO { 

    public void addUser(String username, String password); 
    public List<String> getUsers(); 
} 

UserDAOImpl.java

public class UserDAOImpl implements UserDAO { 
    public static final Logger LOG = LoggerFactory.getLogger(UserDAOImpl.class); 
    private static Session session; 

    private static void beginSession() { 
     session = DbUtils.getSessionFactory().openSession(); 
     session.beginTransaction(); 
    } 

    @Override 
    public void addUser(String username, String password) { 
     String encryptedPassword = Utils.encrypt(password); 
     User user = new User(username, encryptedPassword); 
     beginSession(); 
     try { 
      session.save(user); 
      System.out.println(user.getPassword()); 
      session.getTransaction().commit(); 
     } catch (SQLGrammarException e) { 
      session.getTransaction().rollback(); 
      LOG.error("Cannot save user", e); 
     } finally { 
      session.close(); 
     } 
    } 

    @Override 
    public List<String> getUsers() { 
     beginSession(); 
     List<String> results = new ArrayList<String>(); 
     String hql = "select username from User"; 
     Query query = null; 
     try { 
      query = session.createQuery(hql); 
      results = query.list(); 
     } catch (HibernateException e) { 
      LOG.error("Cannot execute query", e); 
     } 
     return results; 
    } 
} 

文件測試用例 SessionFactoryRul e.java

public class SessionFactoryRule implements MethodRule { 
    private SessionFactory sessionFactory; 
    private Transaction transaction; 
    private Session session; 
@Override 
public Statement apply(final Statement statement, FrameworkMethod method, Object test) { 
    return new Statement() { 
     @Override 
     public void evaluate() throws Throwable { 
      sessionFactory = createSessionFactory(); 
      createSession(); 
      beginTransaction(); 
      try { 
       statement.evaluate(); 
      } finally { 
       shutdown(); 
      } 
     } 
    }; 
} 
private void shutdown() { 
    try { 
     try { 
      try { 
       transaction.rollback(); 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
      session.close(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
     sessionFactory.close(); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

private SessionFactory createSessionFactory() { 
    Configuration configuration = new Configuration().configure(); 
    configuration.addAnnotatedClass(User.class) 
    .addAnnotatedClass(Message.class); 
    configuration.setProperty("hibernate.dialect", 
      "org.hibernate.dialect.H2Dialect"); 
    configuration.setProperty("hibernate.connection.driver_class", 
      "org.h2.Driver"); 
    configuration.setProperty("hibernate.connection.url", "jdbc:h2:./data/db"); 
    configuration.setProperty("hibernate.hbm2ddl.auto", "create"); 
    SessionFactory sessionFactory = configuration.buildSessionFactory(); 
    return sessionFactory; 
} 

public Session createSession() { 
    session = sessionFactory.openSession(); 
    return session; 
} 

public void commit() { 
    transaction.commit(); 
} 

public void beginTransaction() { 
    transaction = session.beginTransaction(); 
} 

public Session getSession() { 
    return session; 
}` 

這裏是我的測試案例

UserDAOTest.java

public class UserDAOTest { 

    @Rule 
    public final SessionFactoryRule sf = new SessionFactoryRule(); 


    @Test 
    public void testAddUser() { 
    Session session = sf.getSession(); 
    UserDAOImpl userDAOImpl = new UserDAOImpl(); 
    String username = "stackoverflow"; 
    String password = "testing"; 
    userDAOImpl.addUser(username, password); 

    } 
} 

這個測試用例正在更新的數據庫中的字段usernamepassword我我正在使用,而發展。我如何停止它並使用h2內存數據庫進行測試。

回答

0

您在UserDAOImpl中有session = DbUtils.getSessionFactory().openSession()。這是使用開發數據庫的原因。您的SessionFactoryRule根本沒有使用。

那麼你可以做什麼。 最好的選擇是使用Spring進行Hibernate配置和單元測試。

其他選項是使用構造函數將sessionFactory設置爲UserDAOImpl

此外,使用static這裏是一個真的很很糟糕的主意

private static Session session;

相關問題