Junit測試私有方法


首先先用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)";

是咱們但願經過getSQLtableNamemap參數拼接出來的語句。測試

由於getSQL是私有方法,咱們不能直接調用,因此咱們必須經過反射來調用。spa

Class<?> clazz  = Database.class;  //活動Database的Class對象

經過DatabaseClass對象和方法名以及參數列表的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構建方式。

相關文章
相關標籤/搜索