wildcatsの日記

赤羽在住でIT関係の会社の社長やってます。

Contract4j

dWの記事を見て試してみた。
BankAccountImpl.java


@Contract
public class BankAccountImpl implements BankAccount {

private float balance;

public BankAccountImpl(float balance) {
this.balance = balance;
}

@Post
public float getBalance() {
return this.balance;
}

public float deposit(float amount) {
return 0;
}

public float withdraw(float amount) {
return 0;
}

}

BankAccountImplTest.java


public class BankAccountTest extends TestCase {

@Override
protected void setUp() throws Exception {
super.setUp();
Contract4J.setEnabled(Contract4J.TestType.Pre, true);
Contract4J.setEnabled(Contract4J.TestType.Post, true);
Contract4J.setEnabled(Contract4J.TestType.Invar, true);
}

public void test() {
BankAccount account = new BankAccountImpl(-1);
try {
account.getBalance();
fail();
} catch (ContractError ignore) {
}
}

}

今回はソースコード中に埋め込みでContractのEnableを指定していますけど
System propertiesに

org.contract4j5.Contract
org.contract4j5.Pre
org.contract4j5.Post
org.contract4j5.Inva
でEnableとかの指定をしても動作するみたい。

ちなみにこれはJava5の言語仕様の話になりますけどInheritedアノテーションってインターフェイスに書けないんですね。
# 今頃気づいたのか!(汗
例えばインターフェイスにContractを書いていても実装で完全に無視されてしまうとContractのチェックは何も実行されません。
言語仕様なので致し方ないのかもしれませんが、かなり嫌な感じ