См. следующий модульный тест, который я создал:
import android.graphics.PointF
import org.junit.Assert.assertEquals
import org.junit.Test
class SimpleTest {
data class A(val x: Float, val y: Float) {
val origin = PointF(x, y)
val origin1 by lazy { PointF(x, y) }
}
val sut = A(10f, 10f)
@Test fun succeed() {
assertEquals(10f, sut.x)
assertEquals(10f, sut.y)
}
@Test fun failed() {
assertEquals(10f, sut.origin.x)
assertEquals(10f, sut.origin.y)
}
@Test fun failed1() {
assertEquals(10f, sut.origin1.x)
assertEquals(10f, sut.origin1.y)
}
}
Второй и третий тестовый пример завершились ошибкой:
java.lang.AssertionError:
Expected :10.0
Actual :0.0
По-видимому, примитивное число с плавающей запятой становится равным 0 при использовании для инициализации PointF
, то же самое применяется при использовании для инициализации RectF
.
Эта ошибка полностью поразила меня, это ошибка в Котлине?
ОБНОВЛЕНИЕ:
Я подтвердил, что три тестовых примера прошли как инструментальный тест, который доказывает, что заглушка классов Android является причиной сбоя теста. Тем не менее, я все еще наблюдаю ту же проблему в своем приложении, которое не является модульным тестом...
data class Viewport(val x: Float, val y: Float, val w: Int, val h: Int, val scale: Float) {
val origin = Point2D(x, y)
val bound = RectF(x, y, x + w * scale, y + h * scale)
....
}
Где-то в приложении у меня есть оператор logcat следующим образом:
Log.d(TAG, "viewport=$viewport, origin=${viewport!!.origin}, bound=${viewport!!.bound}")
И вывод logcat, который я получил, таков:
01-05 12:53:17.376 10870-10870/com.quirklogic.ink D/Painter: viewport=Viewport(x=-292.81342, y=-39.189453, w=720, h=1280, scale=1.0), origin=Point2D(x=-292.81342, y=-39.189453), bound=RectF(0.0, 0.0, 720.0, 1280.0)
01-05 12:53:17.412 10870-10870/com.quirklogic.ink D/Painter: viewport=Viewport(x=-292.81342, y=-39.189453, w=720, h=1280, scale=1.0), origin=Point2D(x=-292.81342, y=-39.189453), bound=RectF(0.0, 0.0, 720.0, 1280.0)
01-05 12:53:17.431 10870-10870/com.quirklogic.ink D/Painter: viewport=Viewport(x=-292.81342, y=-39.189453, w=720, h=1280, scale=1.0), origin=Point2D(x=-292.81342, y=-39.189453), bound=RectF(0.0, 0.0, 720.0, 1280.0)
01-05 12:53:17.448 10870-10870/com.quirklogic.ink D/Painter: viewport=Viewport(x=-292.81342, y=-39.189453, w=720, h=1280, scale=1.0), origin=Point2D(x=-292.81342, y=-39.189453), bound=RectF(0.0, 0.0, 720.0, 1280.0)
01-05 12:53:17.468 10870-10870/com.quirklogic.ink D/Painter: viewport=Viewport(x=-292.81342, y=-39.189453, w=720, h=1280, scale=1.0), origin=Point2D(x=-292.81342, y=-39.189453), bound=RectF(0.0, 0.0, 720.0, 1280.0)
01-05 12:53:17.487 10870-10870/com.quirklogic.ink D/Painter: viewport=Viewport(x=-292.81342, y=-39.189453, w=720, h=1280, scale=1.0), origin=Point2D(x=-292.81342, y=-39.189453), bound=RectF(0.0, 0.0, 720.0, 1280.0)
01-05 12:53:17.501 10870-10870/com.quirklogic.ink D/Painter: viewport=Viewport(x=-292.81342, y=-39.189453, w=720, h=1280, scale=1.0), origin=Point2D(x=-292.81342, y=-39.189453), bound=RectF(0.0, 0.0, 720.0, 1280.0)
ОБНОВЛЕНИЕ 2:
Я понял, что это действительно моя вина, что я изменил границу, которая сбрасывала ее на начало координат (0, 0). С Котлином проблем нет.