2017-11-27 2 views
0

私は、別のクラスのメソッドを呼び出す方法determineFiltersPassと、kotlin SmsHandlerでクラスを持っているSmsSendingFiltersMockitoのユニットテスト:クラスのすべてのメソッド呼び出しに、「真」を返す

class SmsHandler(val filterPredicates: SmsSendingFilters) { 
    fun determineFiltersPass(sms: SmsDto): Boolean = with(sms.filters) { 
     var pass = true 
     for (filter in FiltersDto::class.memberProperties) 
      pass = when (FilterType.valueOf(filter.name.toUpperCase())) { 
       UNIQUE -> if (filter.get(sms.filters) != null) { 
        val unique = filter.get(sms.filters) as Boolean 
        pass && if (unique) filterPredicates.isUnique().test(sms) else true 
       } else pass && true 
       RECENT -> if (filter.get(sms.filters) != null) { 
        pass && filterPredicates.shouldSendByTimePeriodFromLastMessage().test(sms) 
       } else pass && true 
       else -> pass && true 
      } 
     pass 
    } 
} 


class SmsSendingFilters { 

    fun isUnique(): Predicate<SmsDto> = Predicate { 
     with(it) { 
     repo.findAllByMessageIdAndMobileNumAndAppIdAndParamMap(messageId!!, mobileNum!!, appId!!, paramMap!!.toString()).isEmpty() 
     } 
    } 

    fun shouldSendByTimePeriodFromLastMessage(): Predicate<SmsDto> = Predicate { 
     val calendar = Calendar.getInstance() 
     calendar.time = Date() 
     with(it.filters.recent ?: "" to "") { 
      val size = this.second.toInt() 
      when (IntervalType.valueOf(this.first.toUpperCase())) { 
       SECOND -> calendar.add(Calendar.SECOND, -1 * size) 
       MINUTE -> calendar.add(Calendar.MINUTE, -1 * size) 
       HOUR -> calendar.add(Calendar.HOUR, -1 * size) 
       MONTH -> calendar.add(Calendar.MONTH, -1 * size) 
       YEAR -> calendar.add(Calendar.YEAR, -1 * size) 
       else -> Unit 
      } 
      with(it) { 
       repo.findAllByMessageIdAndMobileNumAndAppId(messageId!!, mobileNum!!, appId!!) 
        .none { it.dateSent?.toInstant()?.isAfter(calendar.toInstant()) ?: true } 
      } 
     } 
    } 
} 

、I私はクラスSmsHandlerをテストして、さらに多くのフィルタが2番目のクラスに追加されることを予測しているので、クラスSmsSendingFiltersのメソッドの呼び出し時にtrueまたはfalseを返す汎用モックを作成したいと思います。各メソッド名の呼び出しを明示的に記述することなく(そう思っていると思いますが)、そうする方法はありますか?

私は、ソートの解決策を探していないよ:

when(filterPredicates.shouldSendByTimePeriodFromLastMessage().test(any()).thenReturn(true) 

しかし、このロジックに準拠しています何か:

when(filterPredicates.<anyMethodInvoked>().test(any())).thenReturn(true) 

答えて

3

You can register an Answer to change the default return value。より複雑な場合にはあなたが賢く何かをする必要があると思います。その場合には、異なるタイプを返すメソッドを有していてもよい。もちろん、

interface Thingy { 
    fun foo() : Boolean 
    fun bar() : Boolean 
} 

class ThingyTest { 
    @Test 
    fun test() { 
     val t1 = mock<Thingy>(defaultAnswer = Answer { false }) 
     println(t1.foo()) // "false" 
     println(t1.bar()) // "false" 

     val t2 = mock<Thingy>(defaultAnswer = Answer { true }) 
     println(t2.foo()) // "true" 
     println(t2.bar()) // "true" 
    } 
} 

、:(優れたmockito-kotlinラッパーを使用して)例えば

あなたのAnswer実装!

+0

迅速な対応をありがとうございます。私は明日仕事でそれを試してみます:D – MaxG

関連する問題