体验了下ApacheCommonsCLi 工具,发现非常好用,可以建立命令行

不说废话了,奉上例子:

 


  1. /** 
  2.  * @author charles.wang 
  3.  * @created Jan 10, 2012 4:30:22 PM 
  4.  * Description: 
  5.  */ 
  6. public class RMDataSource { 
  7.  
  8.      
  9.     //简单的测试下 
  10.     public static int simpleTest(String[] args){ 
  11.          
  12.         ResourceBundle resourceBundle = ResourceBundle.getBundle("message",Locale.getDefault()); 
  13.          
  14.         //创建一组Option并且封装在Options对象中 
  15.         Options opts = new Options();  
  16.         //每个选项有3个参数, 
  17.         //第一个参数是简短的名字, 
  18.         //第二个参数是这个命令选项是否需要参数, 
  19.         //第三个参数是这个选项的描述 
  20.         opts.addOption("h"false, resourceBundle.getString("HELP_DESCRIPTION")); 
  21.         opts.addOption("i"true, resourceBundle.getString("HELP_IPADDRESS"));  
  22.         opts.addOption("p"true, resourceBundle.getString("HELP_PORT"));  
  23.         opts.addOption("t"true, resourceBundle.getString("HELP_PROTOCOL"));  
  24.          
  25.         //创建一个基本解析器 
  26.         BasicParser parser = new BasicParser();  
  27.         //表示一个命令行对象,将会被Options所解析 
  28.         CommandLine cl;  
  29.         try {  
  30.             //让解析器来基于Options来解析命令行传入的参数,解析的结果放入CommandLine对象 
  31.             cl = parser.parse(opts, args);  
  32.             //如果解析完得到的Option的集合长度不为空,表明有一些选项 
  33.             if (cl.getOptions().length > 0) {  
  34.                  
  35.                 //对选项进行判断,首先看是否有-h选项,这个选项是用于打印出帮助,不做其他任何动作 
  36.                 //如果有h选项,则用HelpFormatter打印出所有选项列表 
  37.                 if (cl.hasOption('h')) {  
  38.                     //用于打印出帮助选项的HelpFormatter 
  39.                     HelpFormatter hf = new HelpFormatter();  
  40.                     hf.printHelp("Options", opts);  
  41.                     return 0
  42.                 }  
  43.                 //否则,将这些选项分离出来,并且来执行判断和构建动作 
  44.                 else {  
  45.                     //分离出这些选项名对应的值 
  46.                     String ip = cl.getOptionValue("i");  
  47.                     String port = cl.getOptionValue("p");  
  48.                     String protocol = cl.getOptionValue("t");  
  49.                     System.out.println("ip: "+ip); 
  50.                     System.out.println("port: "+port); 
  51.                     System.out.println("protocol:   "+protocol); 
  52.                     return 0
  53.                 }  
  54.             }  
  55.             //否则,表明没有解析到任何的选项,所以就出错 
  56.             else {  
  57.                System.err.println(resourceBundle.getString("ERROR_NOARGS"));  
  58.                return 1
  59.             }  
  60.         } catch (ParseException e) {  
  61.             e.printStackTrace();  
  62.             return 1
  63.         }  
  64.     }  
  65.      
  66.  

 

单元测试:

 

  1. public class RMDataSourceTest { 
  2.  
  3.     @Before 
  4.     public void setUp() throws Exception { 
  5.     } 
  6.  
  7.     @After 
  8.     public void tearDown() throws Exception { 
  9.     } 
  10.  
  11.     // 测试带有 –h 参数的代码功能,则应该打印出帮助文档,并且正确返回 
  12.     @Test 
  13.     public void testHelp() {  
  14.         System.out.println("***TC:Test -h option***"); 
  15.         String args[]={"-h"};  
  16.         assertEquals(0, RMDataSource.simpleTest(args));  
  17.         System.out.println("***********************"); 
  18.     }  
  19.  
  20.     // 测试没有带 –h 参数的代码功能 ,则 应该有错误,因为不允许没有参数的命令行 
  21.     @Test 
  22.     public void testNoArgs() {  
  23.         System.out.println("***TC:Test no argument options***"); 
  24.         String args[] = new String[0];  
  25.         assertEquals(1, RMDataSource.simpleTest(args));  
  26.         System.out.println("***********************"); 
  27.     }  
  28.  
  29.     // 测试输入所有正确参数的代码功能,此时应该正确返回 
  30.     @Test 
  31.     public void testRMDataSource() {  
  32.       /**  
  33.        * 此字符串参数等同于在命令行窗口输入命令 java rmdatasource -i 192.168.0.2 -p 5988 -t http  
  34.         */  
  35.         System.out.println("***TC:Test normal arguments options***"); 
  36.         String args[] = new String[]{"-i","192.168.0.2","-p","5988","-t","http"};  
  37.         assertEquals(0, RMDataSource.simpleTest(args));  
  38.         System.out.println("***********************"); 
  39.     }  
  40.