@SankaSanka

Как правильно замокать коннекшен через Mockito или протестировать методы работающие с базой данных по другому?

есть Connection pull
вот такой
import java.io.PrintWriter;
import java.io.StringWriter;
import java.sql.Connection;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class ConnectionPool {

	private ConnectionPool() {
	}

	private static ConnectionPool instance = null;

	public static ConnectionPool getInstance() {
		if (instance == null)
			instance = new ConnectionPool();
		return instance;
	}

	public Connection getConnection() {
		Connection con = null;
		try {

			Context initCtx = new InitialContext();
			Context envCtx = (Context) initCtx.lookup("java:comp/env");

			DataSource ds = (DataSource) envCtx.lookup("jdbc/paymentsdb");

			con = (Connection) ds.getConnection();
		} catch (NamingException | SQLException ex) {
			ex.printStackTrace();

			StringWriter sw = new StringWriter();
			PrintWriter pw = new PrintWriter(sw);
			ex.printStackTrace(pw);
			System.out.println(sw);
		}
		return con;
	}

}


к нему есть контекст.
приложение работает нормально.

теперь хочу написать тесты к методам из класса DBManager работающие с базой данных. вот таким например
public static List<Report> getReports() throws SQLException {
		List<Report> reports = new ArrayList<Report>();

		PreparedStatement ps = null;
		ResultSet rs = null;
		Connection con=null;
		try {
			con = ConnectionPool.getInstance().getConnection();
			ps = (PreparedStatement) con.prepareStatement(SQL_GET_ALL_REPORTS);
			rs = ps.executeQuery();
			while (rs.next()) {
				reports.add(
						new Report(rs.getString("data"), rs.getString("customer_email"), rs.getString("textreport")));
			}
		} finally {
			close(rs);
			close(ps);
			close(con);
		}
		return reports;
	}


но JUnit не понимает пула томката. и отказывается коннектится к базе

хочу подменить этот пул на обычный конекшен
public static Connection getConnection() throws SQLException {
        String url = "jdbc:mysql://localhost:3306/paymentsdb?allowPublicKeyRetrieval=true";
        Properties prop = new Properties();
        prop.put("user", "root");
        prop.put("password", "admin");
        prop.put("useSSL", "false");
        prop.put("serverTimezone", "UTC");
        prop.put("characterEncoding", "UTF-8");
        return DriverManager.getConnection(url, prop);

    }


с помощью Mock. или может есть другой способ это правильно сделать?

подскажите пожалуйста. второй день бьюсь не работает никак.
  • Вопрос задан
  • 702 просмотра
Пригласить эксперта
Ответы на вопрос 2
mayton2019
@mayton2019 Куратор тега Java
Bigdata Engineer
Никто не мокает коннекшен. Это не твоя библиотека а драйверно-базовая. И в ней нет бизнес-логики и нечего тестировать. Ты же не сотрудник Oracle? Верно?

Тебе нужно сделать декомпозицию твоей задачи на DAO объекты и бизнес логику и замокать только DAO.
Тогда процесс тестирования упрощается.
Ответ написан
Комментировать
@SankaSanka Автор вопроса
Спасибо.
допустим у меня есть DAOdbmanager interface . доступ к dbManager с методами которые мне надо тестить идет через него.
Как написать тест?
Ничего же не поменялось. у меня по прежнему нет конекшен
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы