Spiderの開発では、JUnit4による自動テストを行っています。オブジェクトの検索処理が心臓部となるので、その正確性を確認しておかなければなりませんし、性質上テストしやすいものでもあるからです。
JUnit4は、アノテーションを使ってテストメソッドなどを指定します。具体的には、@Test
を付したメソッドはテストされ、@Before
や@After
を付したメソッドはテストメソッドの実行前後に呼び出されます。
ここで、見落としがちなのは、テストメソッドを有するテストクラスのコンストラクタがいつ呼び出されるのか、という点です。
わたしの認識では、何度もテストクラスのオブジェクトを構築するのは無駄ですから、テストクラスのオブジェクトが構築されると、以後、そのオブジェクトが使い回されるものと思っていました。しかし、実際には、テストメソッドを実行するたびに新たなテストクラスのオブジェクトが構築されます。これを見落とすと、初期化されているはずのフィールドが初期化されていなかったり、値を設定したはずのフィールドに何も設定されていないという事態が生じることになります。
なお、JUnit4のAPIリファレンスには、「To run the method, JUnit first constructs a fresh instance of the class then invokes the annotated method.」と書かれており、アノテーションが付されたメソッドを呼び出すときには、JUnitは新しいインスタンスを生成するということが明記されています。その他に、このことについて言及しているドキュメントはあったのでしょうか。自分としては、見かけませんでした。