tdd 方式で実装する場合、クラスの内部についてアサートしますか、それともパブリック API についてのみアサートしますか?
バイナリヒープを実装しているとしましょう。オブジェクトを追加した後、ヒープのプロパティが保持されていることを主張したいと思います。リフレクションによって内部配列を取得し、その内容についてアサートするのは理にかなっていますか? すなわち
@Test
public void shouldPreserveHeapProperty() {
// when
heap.push(3);
heap.push(2);
heap.push(1);
// then
assertThat(Reflection.get(heap,"elements"))).contains(3,2,1);//made up Reflection class
}
それともその公開APIによるものですか?ただし、テストごとに複数のアサーションが必要になります。
@Test
public void shouldPreserveHeapProperty() {
// when
heap.push(3);
heap.push(2);
heap.push(1);
// then
assertThat(heap.pop()).isEqualTo(3);
assertThat(heap.pop()).isEqualTo(2);
assertThat(heap.pop()).isEqualTo(1);
}
さらに、並行コードのテストをどのように実装しますか? 内部ロックにアクセスせずにデッドロックや待機をシミュレートするのが非常に難しい場合があります。