Pythonのユニットテストとモック

Javaの人から見るとびっくりするPython

class Language:
  def getName(self):
    return 'Java'

class Person:
  def __init__(self):
    self.language = Language()

  def getLanguage(self):
    self.language.getName()

Language.getNameはJavaという文字列を返すだけ、Person.getLanguageはLanguage.getNameに委譲をかけてるだけ。

class PersonTest(unittest.TestCase):
  def setUp(self):
    self.person = Person()

  def testGetLanguage(self):
    self.assertEqual('Java', self.person.getLanguage())

if __name__ == '__main__':
  unittest.main()

実行すれば、当然のごとくOK。

じゃ、テストコードをちょっと変えてみると・・・

class PersonTest(unittest.TestCase):
  def setUp(self):
    self.person = Person()

  def testGetLanguage(self):
    def getName(self):
      return 'Python'
    #Language.getNameの実装を上のgetNameに置き換えてる
    Language.getName = getName

    self.assertEqual('Python', self.person.getLanguage())

if __name__ == '__main__':
  unittest.main()

とこんなことができて、モックライブラリとかいるの?見たいな状況に・・・