Mockitoでprivateなフィールドをモック化する方法

以下のようにprivateなフィールドをモック化する場合、リフレクションを使うと出来るのだが、Mockitoにはそのリフレクションを簡単に使えるWhiteboxというユーティリティクラスがある。

public class MyClass {

    private final MyField field = new MyField();

    public void methodA() {
        field.methodB();
    }

}

Whiteboxクラスの使い方は以下(MyFieldクラスをモック化し、メソッドが呼ばれている事を検証する例)。

public class MyClassTest {

    MyClass sut;
	
    @Before
    public void setUp() throws Exception {
        sut = new MyClass();
        Whitebox.setInternalState(sut, "field", mock(MyField.class));
    }

    @Test
    public void testMethodA() {
        sut.methodA();
        verify((MyField)Whitebox.getInternalState(sut, "field")).methodB();
    }

}

ドットインストールのExpress入門の補足

ドットインストールの「Express入門」「#19 記事を更新/削除してみよう」でちょっと躓いたのでメモしておく。

具体的には記事の削除ボタンを押すと、一番上の記事しか消えないという状況に。
で、理由を調べてみるとpost.jsの以下の記事削除処理で、req.body.idがundefinedになっている事が原因と分かった(splice()の第一引数にundefinedを渡すと0と同じになる?)。

exports.destroy = function(req, res) {
    posts.splice(req.body.id, 1);
    res.redirect('/');
};

で、何でundefinedになってしまうかと言うと、index.ejsで以下のようにidをhidden属性で渡していないから。

<form method="post" action="/posts/<%= i %>">
<input type="hidden" name="_method" value="delete">
<input type="submit" value="del">
</form>

ということで、以下のようにすれば問題解決。

<form method="post" action="/posts/<%= i %>">
<input type="hidden" name="id" value="<%= i %>">
<input type="hidden" name="_method" value="delete">
<input type="submit" value="del">
</form>

ドットインストールのNode.js入門の補足

ドットインストールの「Node.js入門」というレッスンでは、「#14 MongoDBに接続してみよう」というのがあるが、これを実施するためには事前にMongoDBのインストールが必要である(当たり前ではあるが)。

レッスンだと以下のようなコマンドを叩いているが、これはあくまでNode.js用のMongoDBドライバ(node-mongodb-native)をインストールしているだけである。

$ npm install mongodb

MongoDB自体のインストールとセットアップは、ドットインストールの「さくらのVPS入門」「#21 MongoDBを導入しよう」というのがあって、これを見れば良い。

奥さんの携帯を機種変更した際のメモ(ソフトバンク)

今月奥さんの携帯を機種変更した際の事をメモしておく。

Wホワイトの解約で少し手間取った。
店頭での説明だとカスタマーサポート【157】に電話すればすぐに解約出来るとの事だったが、自動音声のガイドだとWホワイトには未加入ということで、解約出来なかった。
そこで、157 → 4(各種変更手続き) → 9(その他、ご契約内容に関するお問い合わせ)で、カスタマーサポートの人に聞いてみると、Wホワイトへの変更申請中というステータスとのこと(一ヶ月単位での切り替えのためそうなっているだとか)。
ということで、その場で解約を依頼すると、変更申請のキャンセルという形ですぐに対応してもらえた。

PostgreSQLでtimestamp型のデフォルト値を現在時刻にするには

ドットインストールのPostgreSQL入門を勉強中に気づいた事をメモしておく。

#05 フィールドに制約をつけてみよう」でtimestamp型のデフォルト値を現在時刻にするために以下のように指定していた。

create table posts (
    id serial primary key,
    title varchar(255) not null, 
    body text check(length(body) > 5),
    is_draft boolean default TRUE,
    created timestamp default 'now' ★★★
);


しかし、これだとテーブル作成時の時刻がデフォルト値になってしまう。
データをInsertした際の現在時刻をデフォルト値とする場合には以下のように指定する必要がある。

create table posts (
    id serial primary key,
    title varchar(255) not null, 
    body text check(length(body) > 5),
    is_draft boolean default TRUE,
    created timestamp default CURRENT_TIMESTAMP ★★★
);


【参考記事】

SafariでThree.jsの練習をするために

ドットインストールThree.js入門が公開されたが、このレッスンをSafariで試そうとしたらいきなり躓いた。原因はSafariだとデフォルトでWebGLが有効になっていない事にあった。で、SafariWebGLを有効にする方法は以下。

  1. Safariの「環境設定」-「詳細」で「メニューバーに"開発"メニューを表示」にチェックを入れる
  2. メニューバーの「開発」で「WebGLを有効にする」を選択する

これでSafariでもThree.jsを試すことが出来るようになった。

【参考記事】

List of unit testing frameworks for Java

A programmer-oriented testing framework for Java

A Mocking framework that tastes really good

A JUnit extension to perform unit testing with database-driven programs

A Java logging API by means of a simple facade pattern (DbUnit uses SLF4J for logging purposes.).

A relational database management system written in Java

A YAML parser and emitter for the Java programming language