2016-07-25 2 views
2

I持ってこのようないくつかの計算含むいくつかの複雑なアクションを実行しようとしているクラス:評価者は、いくつかの複雑なロジックが含まれている場合がありますのではテスト目的のためにクラスのパッケージプライベートにすることは可能です

public class ComplexAction { 

    public void someAction(String parameter){ 
     ComplexActionEvaluator evaluator = new ComplexActionEvaluator(); 
     int value = evaluator.eval(parameter); 
     //some other actions 
    } 

    static class ComplexActionEvaluator implements Evaluator{ 
     public int eval(String parameter){ 
      //evaluation 
     } 
    } 
} 

//package-private, uses only for Actions 
interface Evaluator{ 
    int eval(String parameter); 
} 

をIそのためのテストを書くのが好きです。しかし、ComplexActionEvaluatorComplexActionに固有なので、パッケージプライベートではなくプライベートにします。しかし、これはテストのためにそれを不可能にするでしょう。

私が最初に気づいたのは、それをデフォルトアクセスにすることだけでした。しかし、デフォルトアクセスはテストのために利用できるようにするためのものです。

どのアクセス修飾子を使用するかの判断がテストによって偏っていると、かなり良いとは思えません。たぶん私は何か間違っているのでしょうか、それとも普通の習慣ですか?

答えて

2

あまりに簡単な答えはありません。あなたは完全に正しいので:(テスト目的のためだけにアクセスを許可する)意味があることは、Javaでは動作しません。他の新しい言語では、メソッド/クラスを「私的なものだがコードをテストするためにアクセス可能」にすることを可能にする概念が導入されたと思います。しかし、Javaはまだありません。

この意味では、これは「慣例」によってのみ解決できます。以下のような:

  1. 他の人が常にをを使用する必要がありますあなたのパッケージ内の物事がを運ぶことを確認し、テストの目的
  2. のために「プライベートではありません」あるものをマークするためのJavadoc(または非javadocコメント)を追加します換言すれば、チーム

の公共:あなたが唯一の特定の部分を無視する人々を「尋ねる」ことができますように、あなたは、単に「本当に公共」のものはそのようにマークし、常にのような文書化されていることを確認してください。あなたのチームの皆さんは理解しています。 「私的な実装」の詳細とみなされるべきである。

+0

実際には、「もしあなたがJavaでそれを解決できないのなら、それをJavaDocsの仕事でやってください」というのが、私の回避策のようです。しかし、私はそれが 'ComplexAction'の内部に' ComplexActionEvaluator'を置くことがこのケースだと思います。 – user3663882

+0

実際には、私はそれが両方であると思います:一方では、回避策です。よりよい解決策があります。一方、適切なjavadocを持つこと自体は良いことです。その意味では:すでにそこにあるものを使うことができます。 – GhostCat

関連する問題