2012-09-10 22 views
1

對於一個Java類,我們正在編寫數據結構類,我們需要編寫一個測試程序類以便與它們一起使用。我正在尋求額外的功勞,並試圖編寫一個單獨的測試程序類,我可以擴展或傳遞一個塊以供任何測試使用。編寫一個類,以便它可以擴展或傳遞塊JAVA

是否可以傳遞一個方法的代碼塊來運行?如果這不可行或不實際,編寫一門課程的最佳方法是什麼?

--CODE--

package Lab1; 

/** 
* @author $RMDan 
* @date 10-Sep-2012 
* @class Tester 
* @desc A Tester class for testing Java classes 
*   For use in Itec 251 
*/ 

import java.io.*; 
import java.util.*; 

public class Tester { 

    //members 
    private String logS; 

    //Constructors 
    //Default to start == true 

    public Tester(){ 
     this(true); 
    } 

    public Tester(Boolean start){ 
     if(start == true){ 
      this.start(); 
     } 
    } 

    public final int start(){ 
     int exit; 
     exit = test(); 
     //this.displayLog(); 
     this.exportLog("Test_Employee.Log"); 
     return exit; 
    } 


    //Change the contents of this method to perform the test 
    private int test(){ 

     return 0; 
    } 

    private void log(String message){ 
     this.log(message,true); 
    } 

    private void log(String message, boolean display){ 
     this.logS += message + "\n"; 

     if(display==true){ 
      System.out.println(message); 
     } 
    } 

    private void displayLog(){ 
     System.out.print(this.logS); 
    } 

    private void exportLog(String file){ 

     try{ 
      String output = this.logS; 
      output = output.replaceAll("\n", System.getProperty("line.separator")); 
      try (BufferedWriter out = new BufferedWriter(new FileWriter(file + ".txt"))) { 
       out.write(output); 
      } 
     } 
     catch(IOException e){ 
      System.out.println("Exception "); 
     } 

    } 
} 

注:最終的start()方法的聲明是沒有閉嘴的編譯器。

回答

1

在java中,「傳遞一個塊」由anonymous classes完成:一個接口或類的實時實現。你可以使用現有的接口一樣Runnable,或者創建自己的接口,它返回一個值,例如:

interface MyTest { 
    int test(); 
} 

然後改變你的代碼,以期望這些中的一個:

public final int start(MyTest myTest) { 
    ... 
    exit = myTest.test(); 
    ... 
} 

然後用它匿名,請致電start方法與匿名MyTest的:

start(new MyTest() { 
    public int test() { 
     // do something 
    } 
})l 


你一定會得到更多的積分USI ng匿名類!

1

「傳遞代碼塊」與使用已知方法(即接口)傳遞對象的引用相同。例如:

public class Tester { 
    public static void testSomeCodeBlock(Runnable codeBlock) { 
    codeBlock.run(); 
    } 
} 

Tester.testSomeCodeBlock(new Runnable() { 
    @Override public void run() { 
    System.out.println("my code block"); 
    } 
}); 

另外,如果你想使用的擴展,你必須讓你的Tester.test()法保護的(也可能是抽象的),所以測試實現可以​​將其覆蓋。

+0

這完全適用於我的目的,我會更加深刻的印象。這也向我展示瞭如果我願意的話,我可以如何覆蓋測試方法。謝謝 – RMDan

2

矯枉過正時間:看看JUnit,這是一個用於許多實際應用的測試框架。它旨在使測試變得輕鬆。典型的測試可能是小本:

import org.junit.*; 
import org.junit.assert.*; 
public class NameOfClassToTest { 
    @Test public void nameOfSpecificTest() { 
     // logic to calculate 'expected' and 'result' 
     // actual example test 
     assertTrue(expected.equals(result)); 
    } 
} 

,並且可以與該執行的命令行:

java org.junit.runner.JUnitCore TestClass1 [...other test classes...] 

(雖然你的IDE可能包括JUnit測試內置支持)。

作爲一名教師,如果實現,如果你從頭開始建立自己的測試框架不是一個JUnit測試...

+0

對於當前的課程,我們只是在研究數據結構和用途,但這對於下一個術語java課程會很有用。我只是想找到一種方法來學習一些事情以備將來使用,從而擴展或使用我自己班級的模塊。 – RMDan

+0

編程中最重要的課程之一就是知道何時避免編程。一盎司精心挑選的外部庫避免了大量的代碼編寫。人們在如何進行測試(以及日誌記錄,以及您可能想到的其他許多事情)方面都經過漫長而艱苦的考慮,並且簡單而強大--JUnit在這方面的工作非常出色。 – tucuxi

相關問題