1

Java クラスの場合、データ構造クラスを作成しており、それらに対応するテスター クラスを作成する必要があります。私は余分な信用を得るつもりで、テストに使用するために拡張またはブロックを渡すことができる単一のテスター クラスを作成しようとしています。

メソッドを実行するためにコードのブロックを渡すことは可能ですか? これが不可能または実用的でない場合、拡張できるようにクラスを作成する最良の方法は何ですか?

- コード -

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() メソッドの宣言の最後の部分は、コンパイラをシャットダウンするためにあります。

4

3 に答える 3

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 テストを実装した方がはるかに感銘を受けます...

于 2012-09-10T19:17:43.677 に答える
1

Javaでは、「ブロックの受け渡し」は匿名クラスによって行われます。つまり、インターフェースまたはクラスのオンザフライ実装です。のような既存のインターフェースを使用することもRunnable、値を返す独自のインターフェースを作成することもできます。次に例を示します。

interface MyTest {
    int test();
}

次に、次のいずれかを期待するようにコードを変更します。

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

次に、匿名で使用するには、匿名のMyTestを使用してstartメソッドを呼び出します。

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


匿名クラスを使用すると、間違いなくより多くのポイントを獲得できます!

于 2012-09-10T18:58:44.877 に答える
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()、テスト実装がオーバーライドできるように、メソッドを保護 (およびおそらく抽象) する必要があります。

于 2012-09-10T18:44:42.020 に答える