本来这种依赖的解耦很复杂,以为不能实现。
原来,要了解for的运行机制,然后进行mock,就可以实现单元测试。
1. 这里是通过迭代遍历Collection。
需要的是.size和.iterator.hasNext()。
fun getBeaconsInfo(beacons:Collection<Beacon>):HashMap<Int,Double>{
var infos = HashMap<Int,Double>()
if (beacons.size > 0) {
for(beacon in beacons){
infos.put(beacon.id3.toInt(),beacon.distance)
}
}
return infos
}
使用了Kotlin测试工具Mockk
@Test
fun getBeaconsInfo1(){
val beacons = mockk<Collection<Beacon>>()
every { beacons.size } returns 3
every { beacons.iterator().hasNext() } returns true andThen true andThen true andThen false
every { beacons.iterator().next().id3.toInt() } returns 8 andThen 5 andThen 1
every { beacons.iterator().next().distance } returns 5.0 andThen 10.0 andThen 1.0
val infos = HashMap<Int, Double>()
infos[8] = 5.0
infos[5] = 10.0
infos[1] = 1.0
assertEquals(infos,SISSIController.instance.getBeaconsInfo(beacons))
}
2. 这里是单纯for循环。
此外,我这里用到了.last()
需要的是.size和isEmpty()。
fun normalize(path: ArrayList<Arrival>): HashMap<Int, Double> {
var rating:HashMap<Int,Double> = HashMap()
var sum = path.last().time - path[0].time
for (i in 1 until path.size) {
rating.put(path[i - 1].beacon, (path[i].time - path[i - 1].time).toInt() * 1.0 / sum)
}
return rating
}
@Test
fun normalize() {
val path = mockk<ArrayList<Arrival>>()
every { path.isEmpty() } returns false
every { path.size } returns 5
every { path.last().time } returns 90000
every { path[0].beacon } returns 1
every { path[0].time } returns 50000
every { path[1].beacon } returns 2
every { path[1].time } returns 60000
every { path[2].beacon } returns 3
every { path[2].time } returns 70000
every { path[3].beacon } returns 4
every { path[3].time } returns 80000
every { path[4].beacon } returns 5
every { path[4].time } returns 90000
val rating: HashMap<Int, Double> = HashMap()
rating[1] = 0.25
rating[2] = 0.25
rating[3] = 0.25
rating[4] = 0.25
assertEquals(rating, SISSIController.instance.normalize(path))
}