7

私は、そのインターフェースのタイプセーフな呼び出しの可能性を追加するフレームワークを作成しました。ここで、JUnitテストを作成するときに、以前にランタイムエラーを引き起こした特定の式がコンパイラーによってチェックされることを示したいと思います。

// this does not compile, because nameProp is of type Property<String>
Integer name = interface.getProperty(nameProp);

おそらく、そのコードをコメントアウトしてそのままにしておくのが最善でしょう。いくつかのテストフレームワークで次のようなものを書くことができるかどうか疑問に思っていました

assertCompilationError() {
     Integer name = interface.getProperty(nameProp);
}

カスタムクラスパスを使用したjavacの呼び出しを自分でいじりたくないのは明らかです。フレームワークコードに抽出できる(そしてJUnitまたはTestNGに寄付できる)一般的なソリューションの可能性がある場合は、そのようなソリューションも歓迎されます。

4

4 に答える 4

2

コンパイルするまでJUnitを実行できません。これは、このチェックには遅すぎます。

ライブラリを使用して、コンパイルされないコードをコンパイルしたり、コンパイルされないことを確認したりすることはできません。

于 2013-01-09T13:17:17.783 に答える
1

いくつかのJavaスクリプト言語でこれを達成できるかどうか知りたいのですが、BeanshellとGroovyを詳しく調べます。おそらく、それらはあなたが利用できる何かを提供します。

私が理解している限り、Javaプログラム(あなたの場合はJUnitテスト)からスクリプトを呼び出すことができるからです。

ただし、最も重要な質問は次のとおりです。

  • それらは完全なJava構文/シナリオに関心のある部分をサポートしていますか?
  • 現在のクラスパスを実行されたスクリプトに伝播する方法はありますか?
于 2013-01-09T13:26:36.203 に答える
1

実際にあなたはできる:

public static void assertCompilationError() {
    try {
          Integer name = (Integer)(Object)interface.getProperty(nameProp);
    } catch (Exception e) {
          //...
    }
} 
于 2013-01-09T14:01:25.127 に答える
0

しばらくして、次のソフトウェアを見つけました。

http://docs.codehaus.org/display/JANINO/Home

問題のブロックのみをコンパイルするために、ある種のハックを実行できるはずです。今のところ、私の例はまだジェネリックをサポートしていないため、機能しません。

于 2013-01-28T08:01:09.057 に答える