简体   繁体   中英

How to call assertEquals with Double Epsilon/Precision in Kotlin?

I was wondering, in Kotlin, is there the possibility to call the equivalent of the java method:

assertEquals(double expected, double actual, double precision)

because everytime I'm getting this method instead

assertEquals(expected: T, actual: T, message: String)

And i can't find the one with the precision parameter. Calling the Java one should be fine too I guess.

My call to the method:

assertEquals(5000.00, calculateCouponAmount(basicFaceValue, basicInterestRate, amortizationBullet, couponNumber1), 0.01)

I'm getting an error because 0.01 gets in the "message" field

I have figured it out!

This is how it's done

import org.junit.*
import Kotlin.Test.assertEquals

Assert.assertEquals(expected, actual, precision) // to use the jUnit standard one
assertEquals(expected, actual, message) // to use the Kotlin one

I couldn't find one, so I created my own set of functions:

import java.math.BigDecimal
import kotlin.math.abs
import kotlin.test.asserter

internal fun assertEquals(expected: Double, actual: Double?, epsilon: Double, message: String? = null) {
    asserter.assertNotNull(null, actual)
    asserter.assertTrue({ messagePrefix(message) + "Expected <$expected>, actual <$actual>, should differ no more than <$epsilon>." },
            abs(expected - actual!!) <= epsilon)
}

internal fun assertEquals(expected: BigDecimal, actual: BigDecimal?, epsilon: Double, message: String? = null) {
    asserter.assertNotNull(null, actual)
    asserter.assertTrue({ messagePrefix(message) + "Expected <$expected>, actual <$actual>, should differ no more than <$epsilon>." },
            (expected - actual!!).abs().toDouble() <= epsilon)
}

internal fun assertEquals(expected: Double, actual: BigDecimal?, epsilon: Double, message: String? = null) {
    asserter.assertNotNull(null, actual)
    asserter.assertTrue({ messagePrefix(message) + "Expected <$expected>, actual <$actual>, should differ no more than <$epsilon>." },
            abs(expected - actual!!.toDouble()) <= epsilon)
}

internal fun messagePrefix(message: String?) = if (message == null) "" else "$message. "

Just check to make sure you're importing the correct class that has the desired assertEquals method on it. Other than that you may want to verify that the calculateCouponAmount() method returns a Double .

It is now included in the official API for Double and Float:

fun assertEquals(
    expected: Double,
    actual: Double,
    absoluteTolerance: Double,
    message: String? = null
): Unit

fun assertEquals(
    expected: Float,
    actual: Float,
    absoluteTolerance: Float,
    message: String? = null
): Unit

See https://kotlinlang.org/api/latest/kotlin.test/kotlin.test/assert-equals.html

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM