Hibernate Junit H2在内存数据库测试用例中更改开发db中的字段

时间:2017-04-21 01:25:17

标签: java hibernate junit

我使用Hibernate开发了一个项目。我试图在内存数据库中使用带有H2的Junit测试它,但测试用例是在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;
    }
}

测试用例的文件 的 SessionFactoryRule.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内存数据库进行测试。

1 个答案:

答案 0 :(得分:0)

session = DbUtils.getSessionFactory().openSession()中有UserDAOImpl。这是使用开发数据库的原因。您的SessionFactoryRule根本没用过。

所以你可以做什么。 最好的选择是使用Spring for Hibernate配置和单元测试。

其他选项是使用构造函数将sessionFactory设置为UserDAOImpl

此外,使用static这是一个非常糟糕的主意

private static Session session;