LoginSignup
0
0

More than 1 year has passed since last update.

Mockを使用したDBのソフトウエアテスト

Posted at

SQL文(insert)実行テスト①

ターゲットクラス

public class DAO {

	/** データベースのURL */
	private String JDBC_URL = "jdbc:XXXXX";
	/** データベースのユーザー名 */
	private final String DB_USER = "sa";
	/** データベースのパスワード */
	private final String DB_PASS = "";

    /**データ追加 */
	private String sql_add = "insert into hero(name, text, location) values(?, ?, ?)";

public boolean create(Hero hero) {
		//データベース接続
    try(Connection conn = DriverManager.getConnection(JDBC_URL, DB_USER, DB_PASS)){
    //INSERT文にユーザー名とテキスト、場所を設定しSQLを完成
			pStmt.setString(1, hero.getUserName());
    		pStmt.setString(2, hero.getText());
            pStmt.setString(3, hero.getLocation());

int result = pStmt.executeUpdate();
			if(result != 1) {
				//登録失敗
				return false;
			}
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}
}

テストクラス

public class DAO_Test {

//疑似環境をMockで構築
	/** テスト対象クラス */
	@InjectMocks
	DAO dao;

	/** モック */
	@Mock
	Connection conn;

	/** モック */
	@Mock
	PreparedStatement pStmt;

	/** モック*/
	@Mock
	ResultSet rs;

	@BeforeEach
	void setUp() throws Exception {
		MockitoAnnotations.initMocks(this);
	}

/**
	 *登録成功 return: true
	 * @throws SQLException
	 */

	/*	@Test
		public void create_test01() throws SQLException {
			Hero hero = new Hero("loginUser01", "text", "Tokyo");

    //eqを用いて、"insert into hero(name, text, location) values(?, ?, ?)"と
    //sql_addが同じであることを伝える
    //sql_addが実行された場合、pStmtが返されるように設定。
			 when(conn.prepareStatement(eq("insert into hero(name, text, location) values(?, ?, ?)"))).thenReturn(pStmt);

    //pStmtが実行し、1が返ってくる。
		     when(pStmt.executeUpdate()).thenReturn(1);
    
    //assertEqualsで確認
      		assertEquals(true, dao.create(hero));
		}

SQL文(select)実行テスト②

ターゲットクラス

public class DAO {

	/** データベースのURL */
	private String JDBC_URL = "jdbc:XXXXX";
	/** データベースのユーザー名 */
	private final String DB_USER = "sa";
	/** データベースのパスワード */
	private final String DB_PASS = "";

/** 全件取得のSQL */
	private String sql_select = "select id,name,text from hero";

public  List<Hero> findAll() {
		List<Hero> heroList = new ArrayList<>();

		//データベース接続
		try(Connection conn = DriverManager.getConnection(JDBC_URL, DB_USER, DB_PASS)){
			//SELECT文の準備
		//	PreparedStatement pStmt = conn.prepareStatement(sql_select);
			PreparedStatement pStmt = conn.prepareStatement(sql_selectFalse);

			//SELECT文を実行
			ResultSet rs = pStmt.executeQuery();

			//SELECT文の結果をArrayListに格納
			while(rs.next()) {
				int id = rs.getInt("id");
				String userName = rs.getString("name");
				String text = rs.getString("text");
				Hero hero = new Hero(id, userName, text);
				heroList.add(hero);
			}
		}catch(SQLException e) {
			e.printStackTrace();
			return null;
		}
		return heroList;
	}

テストクラス

public class DAO_Test {

//疑似環境をMockで構築
	/** テスト対象クラス */
	@InjectMocks
	DAO dao;

	/** モック */
	@Mock
	Connection conn;

	/** モック */
	@Mock
	PreparedStatement pStmt;

	/** モック*/
	@Mock
	ResultSet rs;

	@BeforeEach
	void setUp() throws Exception {
		MockitoAnnotations.initMocks(this);
	}
/**
	 * heroListのサイズが1以上ある
	 * @throws SQLException
	 */
	@Test
	public void findAll_test01() throws SQLException {
		List<Hero>heroList =  dao.findAll();
		int size = heroList.size();
		assertEquals(2, size);
	}

	/**
	 * 取得したheroListのUserNameには、Aliceが含まれる
	 * @throws SQLException
	 */
	@Test
	public void findAll_test02() throws SQLException {
		List<Hero>heroList =  dao.findAll();
		boolean flg = false;

		flg = heroList.stream().anyMatch(hero -> hero.getUserName().equals("Alice"));
		assertEquals(true, flg);
	}
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0