【问题标题】:A function is not executed in an unit test单元测试中未执行函数
【发布时间】: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


【解决方案1】:

该方法没有执行,因为你模拟了这个类

@RunWith(MockitoJUnitRunner::class)
class OrderStateMonitorTest : BaseTest() {

 @InjectMocks
    private lateinit var orderStateMonitor: OrderStateMonitor
@Mock
    private lateinit var qualityControlCheckRequiredDuringFuellingBus: QualityControlCheckRequiredDuringFuellingBus

    private lateinit var qualityControlChecksDataProvider: QualityControlChecksDataProvider


  @Before
    fun setUp() {
        qualityControlChecksDataProvider = spy(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)
    }
}

或使用CALL_REAL_METHOD

@RunWith(MockitoJUnitRunner::class)
class OrderStateMonitorTest : BaseTest() {

 @InjectMocks
    private lateinit var orderStateMonitor: OrderStateMonitor
@Mock
    private lateinit var qualityControlCheckRequiredDuringFuellingBus: QualityControlCheckRequiredDuringFuellingBus

    private lateinit var qualityControlChecksDataProvider: QualityControlChecksDataProvider

// java syntax
@before
public void setUp(){
  qualityControlChecksDataProvider = mock(QualityControlChecksDataProvider, Mocktio.CALL_REAL_METHOD);
}

  @Test
    fun `upliftedVolumeUpdated abcdefg`() {
        qualityControlChecksDataProvider.loadMapWithQCChecksForMilestone()
        every(fuelOrderValuesProvider.upliftedVolume()).thenReturn(1000.0f)

        orderStateMonitor.upliftedVolumeUpdated()

        verify(qualityControlCheckRequiredDuringFuellingBus, never()).postUnavailable()
        verify(qualityControlCheckRequiredDuringFuellingBus, once()).postAvailable(qualityControlChecks)
    }
}

【讨论】:

  • 我试过 val qualityControlCheckDataProviderx = spy(QualityControlChecksDataProvider::class.java) every(qualityControlCheckDataProviderx.getQualityControlCheckDataForUplift(ArgumentMatchers.any(), ArgumentMatchers.anyFloat())).thenReturn(qualityControlChecks)
  • org.mockito.exceptions.base.MockitoException:无法创建“QualityControlChecksDataProvider”类型的模拟实例
猜你喜欢
  • 2022-01-25
  • 1970-01-01
  • 2019-08-10
  • 2018-12-18
  • 1970-01-01
  • 2013-03-20
  • 2016-04-15
  • 2016-02-09
  • 1970-01-01
相关资源
最近更新 更多