私の質問はユニットテストについてです。以下のクラスがあると仮定します。
class X
{
public function p1(){
//logic
$a = $this->p2();
//more logic
}
public function p2(){
//even more logic
}
}
p1メソッドの単体テストを作成する場合、p2メソッドをモックする必要がありますか?
私が考えているのは、p1メソッド用に作成されたテストは、p2ではなくp1メソッドのみを実行してテストする必要があるということです。しかし、クラスXのモックを取得し、そのモックインスタンスで以下のようにp1メソッドを呼び出す必要があることを理解するために。
$xMock = $this->getMockBuilder('\X')
->setMethods(array('p2'))
->getMock();
$xMock->expects($this->any())
->method('p2')
->will($this->returnValue($value));
$resultTobeAsserted = $xMock->p1();
残念ながら、それを行うことは私には少し間違っていると感じます。このトピックについて同僚と話し合ったところ、SUT(テスト対象システム)をどのように定義するかということになりました。テスターがテストされている特定のメソッドをSUTと見なす場合、SUTから呼び出される他のメソッドは依存関係のように見え、当然テスターはそれらをモックしたいと思うでしょう。一方、テスターがクラス全体をSUTと見なす場合、それらのメソッド呼び出しはテストの一部になるため、それらをモックする理由はありません。
その結論は正しいですか?どのような考え方で、より堅牢な単体テストが得られますか?