0

Constantsクラス内の各値が一意であることを確認するために、クラスに対して実行するテストを作成する必要があります。私は定数名(IDEはそれらが重複しているかどうかを開発者に通知します)ではなく、定数が設定されている値について話します。

私はJavaを初めて使用しますが、これを実行する方法がわかりません。

明確にするために、私のConstantsクラスは次のように定義されています。

public static final String STATUS_RECEIVED = "RE";
public static final String STATUS_CANCELLED = "CA";
public static final String STATUS_REVIEWED = "RE";

上記の例では、値が重複していることにテストで注意する必要があります(STATUS_RECEIVED == STATUS_REVIEWEDであるため)。これをプログラムで行うにはどうすればよいですか?

4

6 に答える 6

2

すべての定数の文字列値を反復処理し、それらがまだセットに含まれていない場合は、それらをセットに固定します。それらがすでにセットに含まれている場合、テストは失敗します。

または、複製を別のセットに貼り付けて、その複製のセットが空であることをテストすることもできます。これにより、テストを実行するたびに複製のリストが表示されます(テストを再実行する必要はありません)。すべての重複を削除しました)。

于 2012-04-18T17:38:59.073 に答える
2
Field[] fields = Constants.class.getDeclaredFields();
List<Field> staticFields = new ArrayList<>();
for(Field f:fields) {
  if (Modifier.isStatic(f)) {
    staticFields.add(f);
  }
}
for (int i = 0; i < staticFields.size(); i++) {
  for (int j = i + 1; j < staticFields.size(); j++) {
    if (staticFields.get(i).get(null).equals(staticFields.get(j).get(null))) {
      throw new AssertionFailedError(staticFields.get(i) + " equals " 
        + staticFields.get(j));
    } 
  }
}
于 2012-04-18T17:40:25.777 に答える
1

を使用java.lang.Class.getFields()して、配列を反復処理し、(を使用して)各値を取得し、Field.get(null)それがすでにセットに含まれているかどうかを確認し、まだ存在しない場合はセットに格納します。

于 2012-04-18T17:43:19.833 に答える
1

フィールドを見つけて、一意性を確認するだけです(たとえば、ツリーマップに入れてからカウントします)。

public void test() throws Exception {
    for (Field f : ConstantsClass.class.getDeclaredFields()) {
        System.out.println(f.getName() + ": " + f.get(null));
    }
}

リフレクションによるJava静的最終ivar値へのアクセスから取得

于 2012-04-18T17:41:59.960 に答える
0

現在の値を保持することを検討してくださいConstants。何かのようなもの:EnumString

public enum Constants {

    STATUS_RECEIVED("RE"),
    STATUS_CANCELLED("CA"),
    STATUS_REVIEWED("RE")

    private String value;

    public Constants(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}

次に、テストvalueは各定数のフィールドを反復処理し、Enumその値がすでに存在する場合は失敗する可能性があります。次に例を示します。

public void testConstantValueUniqueness() {
    Set<String> values = new HashSet<String>();
    for(Constants constant : Constants.values()) {
        if(values.contains(constant.getValue())) {
            // fail
        }
        values.add(constant.getValue());
    }
}
于 2012-04-18T17:47:50.733 に答える
0

代わりに列挙型を使用すると、生活がはるかに楽になります。次に、メンバー名を必要な値と一致させるかどうかを選択できます

enum Status {
RE,CA,RE;
}

この場合、コンパイラはそれらが一意であることを保証するか、値をプロパティとして格納します

enum Status {
  averbosenamedescribingwhatremeans("RE") 
  etc, etc

  private final String statusCode;

  Status(String code) {
  this.statusCode = code;
  }  
}

enumsが提供するvalues()メソッドを使用すると、単体テスト内のコードの一意性を簡単に確認できます。

さらに、タイプセーフなコードがあります。

現在のアプローチでは、リフレクションを介してクラスをクエリする必要があります。

于 2012-04-18T17:41:32.897 に答える