package egovframework.rte.psl.dataaccess.ibatis; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.core.io.ClassPathResource; import org.springframework.jdbc.BadSqlGrammarException; import org.springframework.jdbc.UncategorizedSQLException; import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.transaction.TransactionConfiguration; import org.springframework.test.jdbc.SimpleJdbcTestUtils; import org.springframework.transaction.annotation.Transactional; import egovframework.rte.psl.dataaccess.TestBase; import egovframework.rte.psl.dataaccess.dao.MapTypeDAO; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath*:META-INF/spring/context-*.xml" }) @TransactionConfiguration(transactionManager = "txManager", defaultRollback = false) @Transactional public class RemapResultsTest extends TestBase { @Resource(name = "mapTypeDAO") MapTypeDAO mapTypeDAO; @Before public void onSetUp() throws Exception { SimpleJdbcTestUtils.executeSqlScript( new SimpleJdbcTemplate(dataSource), new ClassPathResource( "META-INF/testdata/sample_schema_ddl_" + usingDBMS + ".sql"), true); // init data SimpleJdbcTestUtils.executeSqlScript( new SimpleJdbcTemplate(dataSource), new ClassPathResource( "META-INF/testdata/sample_schema_initdata_" + usingDBMS + ".sql"), true); } @SuppressWarnings("unchecked") @Test // @ExpectedException(BadSqlGrammarException.class) // tibero 인 경우는 UncategorizedSQLException 이 되돌려지므로 // 메서드 내부에서 try ~ catch 로 처리토록 변경 public void testReplaceTextAllQueryExpectedException() throws Exception { try { // selectQuery Map<String, Object> map = new HashMap<String, Object>(); StringBuilder selectQuery = new StringBuilder(); selectQuery.append("select * from DEPT"); map.put("selectQuery", selectQuery.toString()); // select List<Map> resultList = mapTypeDAO.getSqlMapClientTemplate().queryForList( "selectUsingReplacedAllQuery", map); assertNotNull(resultList); assertEquals(4, resultList.size()); assertTrue(resultList.get(0).containsKey("deptNo")); map.clear(); selectQuery = new StringBuilder(); selectQuery.append("select * from DEPT "); selectQuery.append("where DEPT_NAME like '%ES%' "); selectQuery.append("order by DEPT_NO DESC "); map.put("selectQuery", selectQuery.toString()); // select // 위에서 동일한 resultset metadata 가 사용되는 // 경우는(table과 select 절이 같은 경우) // replaced text 처리의 쿼리 사용에 문제가 없음. // cf.) resultset metadata 는 caching 되고 있음에 // 유의! resultList = mapTypeDAO.getSqlMapClientTemplate().queryForList( "selectUsingReplacedAllQuery", map); assertNotNull(resultList); // 20,'RESEARCH','DALLAS' -- R'ES'EARCH // 30,'SALES','CHICAGO' -- SAL'ES' assertEquals(2, resultList.size()); assertTrue(resultList.get(0).containsKey("deptNo")); map.clear(); selectQuery = new StringBuilder(); selectQuery.append("select * from EMP "); map.put("selectQuery", selectQuery.toString()); // select // 위에서 resultset metadata 가 달라지는 경우 // replaced text 처리의 쿼리 사용시 최초에 caching 된 // resultset metadata 에 현재 조회하는 정보가 없으므로 에러 // 발생함! resultList = mapTypeDAO.getSqlMapClientTemplate().queryForList( "selectUsingReplacedAllQuery", map); fail("이 라인이 수행될 수 없습니다."); } catch (BadSqlGrammarException be) { assertNotNull(be); } catch (UncategorizedSQLException ue) { // tibero 인 경우 Spring 에서 // UncategorizedSQLException <-- // NestedSQLException <-- TbSQLException 으로 // 처리됨 assertNotNull(ue); // assertTrue(ue.getCause().getCause() instanceof TbSQLException); } catch (Exception e) { e.printStackTrace(); fail("기대한 exception 이 아닙니다."); } } @SuppressWarnings("unchecked") @Test public void testReplaceTextRemapResultsAllQuery() throws Exception { // selectQuery Map<String, Object> map = new HashMap<String, Object>(); StringBuilder selectQuery = new StringBuilder(); selectQuery.append("select * from DEPT"); map.put("selectQuery", selectQuery.toString()); // select List<Map> resultList = mapTypeDAO.getSqlMapClientTemplate().queryForList( "selectUsingReplacedAllQueryUsingRemapResults", map); assertNotNull(resultList); assertEquals(4, resultList.size()); assertTrue(resultList.get(0).containsKey("deptNo")); map.clear(); selectQuery = new StringBuilder(); selectQuery.append("select * from EMP "); map.put("selectQuery", selectQuery.toString()); // select // 위에서 resultset metadata 가 달라지는 경우라도 // remapResults="true" 로 설정하여 // resultset metadata 를 caching 하지 않으므로 에러 발생 // 않음 resultList = mapTypeDAO.getSqlMapClientTemplate().queryForList( "selectUsingReplacedAllQueryUsingRemapResults", map); assertNotNull(resultList); assertEquals(14, resultList.size()); assertTrue(resultList.get(0).containsKey("empNo")); } }