【发布时间】:2020-05-01 15:03:01
【问题描述】:
我觉得这很难解释,但会尽量保持简单 我正在编写一个单元测试,其中一个函数 (getQualityControlCheckDataForUplift()) 在另一个类中被访问,但它确实进入了函数并执行了它应该做的事情,它直接返回语句。
这就是函数。我应该嘲笑QualityControlCheck 这是data class
我已经缩短了代码,使其更清晰,更容易理解
在我的测试用例中,
- 我加载了 MAP - qualityControlChecksDataProvider.loadMapWithQCChecksForMilestone()
- 然后 orderStateMonitor 在测试用例中调用 orderStateMonitor.upliftedVolumeUpdated() 访问该映射。哪个实习生通过
showQualityControlChecks()访问getQualityControlCheckDataForUplift() - 无法进入
getQualityControlCheckDataForUplift()不知道为什么
任何建议都会很有帮助 如果代码不易于理解,我真的很抱歉
fun getQualityControlCheckDataForUplift(qualityControlMilestone: QualityControlMilestone, uplift: Float):
ArrayList<QualityControlCheck>? {
val qcChecksForUplift: ArrayList<QualityControlCheck>? = ArrayList()
val qcChecksForMilestone = mapOfQCChecksForMilestone[qualityControlMilestone.milestoneText]
qcChecksForMilestone?.forEach {
if (it.uplift == uplift) qcChecksForUplift?.add(it)
}
return qcChecksForUplift
}
我的测试用例
@RunWith(MockitoJUnitRunner::class)
class OrderStateMonitorTest : BaseTest() {
@InjectMocks
private lateinit var orderStateMonitor: OrderStateMonitor
@Mock
private lateinit var qualityControlCheckRequiredDuringFuellingBus: QualityControlCheckRequiredDuringFuellingBus
@Mock
private lateinit var qualityControlChecksDataProvider: QualityControlChecksDataProvider
@Before
fun setUp() {
qualityControlChecksDataProvider = QualityControlChecksDataProvider(offlineDataStorage, app)
}
@Test
fun `upliftedVolumeUpdated abcdefg`() {
qualityControlChecksDataProvider.loadMapWithQCChecksForMilestone()
every(fuelOrderValuesProvider.upliftedVolume()).thenReturn(1000.0f)
orderStateMonitor.upliftedVolumeUpdated()
verify(qualityControlCheckRequiredDuringFuellingBus, never()).postUnavailable()
verify(qualityControlCheckRequiredDuringFuellingBus, once()).postAvailable(qualityControlChecks)
}
}
OrderStateMonitor
class OrderStateMonitor @Inject constructor(
private val orderStorage: CurrentOrderStorage,
private val fuelOrderValuesProvider: FuelOrderValuesProvider,
private val noServiceRequiredAvailabilityBus: NoServiceRequiredAvailabilityBus,
private val qualityControlCheckRequiredDuringFuellingBus: QualityControlCheckRequiredDuringFuellingBus,
private val qualityControlChecksDataProvider: QualityControlChecksDataProvider
) {
fun upliftedVolumeUpdated() {
showQualityControlChecks()
}
private fun showQualityControlChecks() {
// WHEN I TRY TO ACCESS ` //qualityControlChecksDataProvider.getQualityControlCheckDataForUplift` IT DOES NOT GET INTO THAT FUNCTION
val qualityControlChecks =
qualityControlChecksDataProvider.getQualityControlCheckDataForUplift(
QualityControlMilestone.FUELLING, 1000.0f)
}
}
QualityControlChecksDataProvider
class QualityControlChecksDataProvider @Inject constructor(
private val offlineDataStorage: OfflineDataStorage,
private val app: App
) {
private val mapOfQCChecksForMilestone = LinkedHashMap<String, ArrayList<QualityControlCheck>?>()
fun loadMapWithQCChecksForMilestone() {
QualityControlMilestone.values().forEach {
mapOfQCChecksForMilestone.put(it.milestoneText, getQualityControlCheckDataForMilestone(it))
}
}
fun getQualityControlCheckData(qualityControlMilestone: QualityControlMilestone):
ArrayList<QualityControlCheck>? =
mapOfQCChecksForMilestone[qualityControlMilestone.milestoneText]
fun getQualityControlCheckDataForUplift(qualityControlMilestone: QualityControlMilestone, uplift: Float):
ArrayList<QualityControlCheck>? {
//DOES NOT GET INTO THIS FUNCTION I RUN THE TEST CASE
val qcChecksForUplift: ArrayList<QualityControlCheck>? = ArrayList()
val qcChecksForMilestone = mapOfQCChecksForMilestone[qualityControlMilestone.milestoneText]
qcChecksForMilestone?.forEach {
if (it.uplift == uplift) qcChecksForUplift?.add(it)
}
return qcChecksForUplift
}
//THERE ARE OTHER PRIVATE FUNCTION WHICH THE ABOVE CODE WILL ACCESS WHICH WORK FINE
}
【问题讨论】:
-
加载地图时,是否声明为静态?
-
您好,感谢您的回复,
QualityControlChecksDataProvider在测试用例中被模拟了,抱歉我最初错过了在这里复制它,我现在更新了我的问题,其中有QualityControlChecksDataProvider的模拟这是你意思是?还是我错过了什么 -
让我回顾一下,你蚂蚁测试这个方法
getQualityControlCheckDataForUplift不能直接访问它,对吧? -
我没有完全测试该方法,但我正在访问应该从 MAP 返回 QCChecks 的方法,但问题是代码根本没有进入该函数。
-
是的,因为你模拟了
QualityControlChecksDataProvider,你可以使用SPY或模拟CALL_REAL_METHOD
标签: java android unit-testing kotlin mocking