> このViewModelが仕様通りに動くかどうかテストしたい場合、どうしますか?
> わざわざその時間になるまで待って動かしますか?
>
> それはさすがにありえないので、
> 任意の値を返せるTimeProviderのモックアップを作ってテストします。

一方俺は、コンストラクタで任意の時間を指定できるようにした
コードは短くなり、インターフェースなど不要になった

class GreetingViewModel {

 var now: Int

 init(now: Int) {
  self.now = now
 }

 func greet() -> String {
  switch self.now() {
  case (let hour) where (6 <= hour && hour <= 11):
   return "Good Morning"
  case (let hour) where (12 <= hour && hour <= 17):
   return "Good Afernoon"
  case (let hour) where (18 <= hour && hour <= 23) || (0 <= hour && hour <= 5):
   return "Good Evening"
  default:
   return "Hello"
  }
 }
}
var viewModel = GreetingViewModel(now: Calendar.current.component(.hour, from: Date()))
print(viewModel.greet())