当前位置: 首页 > 知识库问答 >
问题:

Mockito单元测试:在类的所有方法调用中,返回“true”[duplicate]

荣德厚
2023-03-14
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 }
            }
        }
    }
}
when(filterPredicates.shouldSendByTimePeriodFromLastMessage().test(any()).thenReturn(true)
when(filterPredicates.<anyMethodInvoked>().test(any())).thenReturn(true)

共有1个答案

鄂曦之
2023-03-14

您可以注册应答以更改默认返回值。

例如(使用优秀的mockito-kotlin包装器):

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"
    }
}

当然,在更复杂的情况下,您可能有返回不同类型的方法,在这种情况下,您需要在answer实现中做一些更聪明的事情!

 类似资料:
  • 问题内容: 使用模拟编写单元测试时遇到问题。我需要模拟的对象有很多吸气剂,我确实在代码中称呼它们。但是,这些不是我的单元测试的目的。因此,有一种方法可以模拟所有方法,而不是一个个地模拟它们。 这是代码示例: 这是我需要测试的服务等级 在测试类中,测试方法就像 因此,有一种方法可以避免将所有无用的“ field1”的“ when”写入“ field20” 问题答案: 您可以控制模拟的默认答案。在创建

  • 我在用Mock编写单元测试时遇到了一个问题。有一个对象,我需要模拟有很多getter,我在代码中调用它们。但是,这些不是我的单元测试的目的。所以,有没有一种方法我可以模拟所有的方法,而不是一个一个地模拟它们。 下面是代码示例: 那么,有没有一种方法可以避免为无用的“field1”到“field20”写所有的“when”

  • 测试方法: 测试用例:

  • 我正在用Mockito为一个项目设置jUnit测试。在被测系统(DrawingService)中调用方法时遇到问题。模拟包括图形和IDrawingRepository。 我不熟悉TDD、单元测试和一般的模拟,所以我可能犯了一些noob错误?任何帮助都将不胜感激。 以下是测试课程: 以下是正在测试的系统:

  • 我正在为服务开发测试用例。 另一个代码: