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
今回はソースコード中に埋め込みでContractのEnableを指定していますけど
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) {
}
}}
System propertiesに
でEnableとかの指定をしても動作するみたい。
org.contract4j5.Contract
org.contract4j5.Pre
org.contract4j5.Post
org.contract4j5.Inva
ちなみにこれはJava5の言語仕様の話になりますけどInheritedアノテーションってインターフェイスに書けないんですね。
# 今頃気づいたのか!(汗
例えばインターフェイスにContractを書いていても実装で完全に無視されてしまうとContractのチェックは何も実行されません。
言語仕様なので致し方ないのかもしれませんが、かなり嫌な感じ。