首先先用eclipse創建一個一個Maven工程,而後在新建工程下添加一個Database類以下:java
public class Database { private static final Logger log = LogManager.getLogger(); public static boolean createDatabase(String databaseName) { Connection con = DBCon.getConnection(); String sql = "create database "+databaseName; try { Statement statement = con.createStatement(); return statement.execute(sql); } catch (SQLException e) { e.printStackTrace(); log.error(e.getSQLState()+" "+e.getMessage()); return false; } } /** * 根據表名和參數的名字和屬性建立表 * @param tableName 要建立表的名字 * @param cols 爲Map類型其中Key是屬性就是列名,Value是約束,就是數據類型,惟一性約束等 * @return */ public static boolean createTable(String tableName,Map<String,String> cols) { String createSQL = getSQL(tableName,cols); Connection con = DBCon.getConnection(); try { Statement statement = con.createStatement(); return statement.execute(createSQL); } catch (SQLException e) { e.printStackTrace(); log.error(e.getSQLState()+" "+e.getMessage()+"多是SQL語句錯誤"); return false; } } /** * 根據表名和列名以及屬性和約束建立表 * @param tableName 表名 * @param cols 列名屬於 屬性類型及約束 * @return 拼接的建立表的SQL字符串 */ private static String getSQL(String tableName,Map<String,String> cols) { StringBuffer sb = new StringBuffer(); sb.append("drop table if exist "); sb.append(tableName); sb.append(" create table "); sb.append(tableName); sb.append("("); for(Entry<String,String> entry:cols.entrySet()) { sb.append(entry.getKey()); sb.append(" "); sb.append(entry.getValue()); sb.append(","); } sb.replace(sb.lastIndexOf(","), sb.length(), ")"); return sb.toString(); } }
咱們主要測試Database類的private static String getSQL(String tableName,Map<String,String> cols)方法。sql
咱們在eclipse中選中Database文件右鍵選擇new而後選擇Junit Test Case而後入下圖選擇Junit 4 test,而且選擇生成setUp()和tearDown()方法,setUp()主要是測試開始以前作一下初始化的工做,tearDown()主要是測試結束以後作一些清理工做。apache
單擊next出現下面的對話框,由於咱們的getSQL方法是一個私有的因此,eclipse並無提供自動生成測試getSQL的方法。不過沒有關係,咱們直接單擊finish而後在測試類中手動添加一個測試方法。安全
下面是Database的測試類,爲了不有一些包導入不一致,我把導入包的代碼也貼出來了。app
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; public class DatabaseTest { @Before public void setUp() throws Exception { } @After public void tearDown() throws Exception { } @Test public void testGetSQL() { String sql = "drop table if exist test create table test(id int unsigned primary key auto_increment,name varchar(50) not null unique)"; Map<String,String> cols = new HashMap<String,String>(); cols.put("id", "int unsigned primary key auto_increment"); cols.put("name", "varchar(50) not null unique"); String result = ""; Class<?> clazz = Database.class; try { Method getSQL = clazz.getDeclaredMethod("getSQL", String.class,Map.class); getSQL.setAccessible(true); result = (String) getSQL.invoke(new Database(), "test",cols); } catch (NoSuchMethodException e) { e.printStackTrace(); System.err.println(e.getMessage()+"方法沒有找到"); } catch (SecurityException e) { e.printStackTrace(); System.out.println(e.getMessage()+"安全權限"); } catch (IllegalAccessException e) { e.printStackTrace(); System.err.println(e.getMessage()+"可能沒有訪問權限"); } catch (IllegalArgumentException e) { e.printStackTrace(); System.err.println(e.getMessage()+"可能有錯誤的參數"); } catch (InvocationTargetException e) { e.printStackTrace(); } System.out.println(sql); System.out.println(result); Assert.assertEquals(sql, result); } }
咱們主要來看一看測試私有方法getSQL方法的testGetSQL。其中:eclipse
String sql = "drop table if exist test create table test(id int unsigned primary key auto_increment,name varchar(50) not null unique)";
是咱們但願經過getSQL用tableName和map參數拼接出來的語句。測試
由於getSQL是私有方法,咱們不能直接調用,因此咱們必須經過反射來調用。spa
Class<?> clazz = Database.class; //活動Database的Class對象
經過Database的Class對象和方法名以及參數列表的Class對象取得一個Method對象。code
Method getSQL = clazz.getDeclaredMethod("getSQL", String.class,Map.class);
下面這一條語句的做用是讓getSQL這個Method對象所表明的私有方法可以在外部調用。xml
getSQL.setAccessible(true);
經過一個Database實例對象和參數來調用getSQL這個Method對象表明的方法。調用一個類方法確定是要在一個實例上了,invoke的第一個參數就表示在哪個實例上調用這個方法。
result = (String) getSQL.invoke(new Database(), "test",cols);
咱們能夠經過右鍵DatabaseTest文件選擇Run As 選擇Junit Test
好,沒有問題。固然這是在我改過不少次以後,沒有問題。每一次我只須要運行DatabaseTest就能夠了,是否是節省了不少時間。
若是要用Maven來構建,須要在pom.xml中加入
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.3</version> </dependency> </dependencies>
而後在eclipse中選擇項目右鍵選擇Run As 選擇Maven clean或者其餘Maven構建方式。