即使我认为没有提供正确的模拟,测试用例仍会通过

问题描述

我正在测试此功能。对我来说主要的一点是调用存储库(add)的partitionsOfATagTransactionRepository.add(transaction,infoToAdd,mutationCondition)方法

def updateOrCreateTagPartitionInfo(transaction:DistributedTransaction,currentTagPartition: Option[TagPartitions],tag: String) = {
    val currentCalendar = Calendar.getInstance() //TODOM - should I use a standard Locale/Timezone (eg GMT) to keep time consistent across all instances of the server application
    val currentYear = currentCalendar.get(Calendar.YEAR).toLong
    val currentMonth = currentCalendar.get(Calendar.MONTH).toLong
    val newTagParitionInfo = TagPartitionsInfo(currentYear.toLong,currentMonth.toLong)
    val (infoToAdd,mutationCondition) = currentTagPartition match {
      case Some(tagPartitionInfo) => {
        //checktest-should add new tag partition info to existing partition info
        (TagPartitions(tagPartitionInfo.tag,tagPartitionInfo.partitionInfo + (newTagParitionInfo)),new PutIfExists)
      }
      case None => {
        //checktest-should add new tag partition info if  existing partition doesn't exist
        (TagPartitions(tag,Set(newTagParitionInfo)),new PutIfNotExists)
      }
    }
    partitionsOfATagTransactionRepository.add(transaction,mutationCondition) //calling a repositoru method which I suppose needs mocking
    infoToAdd
  }

我写了这个测试用例来测试方法

"should add new tag partition info if  existing partition doesn't exist" in {
      val servicesTestEnv = new ServicesTestEnv(components = components)
      val questionTransactionDBService = new QuestionsTransactionDatabaseService(
        servicesTestEnv.mockAnswersTransactionRepository,servicesTestEnv.mockPartitionsOfATagTransactionRepository,servicesTestEnv.mockPracticeQuestionsTagsTransactionRepository,servicesTestEnv.mockPracticeQuestionsTransactionRepository,servicesTestEnv.mockSupportedTagsTransactionRepository,servicesTestEnv.mockUserProfileAndPortfolioTransactionRepository,servicesTestEnv.mockQuestionsCreatedByUserRepo,servicesTestEnv.mockTransactionService,servicesTestEnv.mockPartitionsOfATagRepository,servicesTestEnv.mockHelperMethods
      )

      val currentCalendar = Calendar.getInstance() //TODOM - should I use a standard Locale/Timezone (eg GMT) to keep time consistent across all instances of the server application
      val currentYear = currentCalendar.get(Calendar.YEAR).toLong
      val currentMonth = currentCalendar.get(Calendar.MONTH).toLong
      val newTagParitionInfo = TagPartitionsInfo(currentYear.toLong,currentMonth.toLong)

      val existingTag = "someExistingTag"
      val existingTagPartitions = None
      val result = questionTransactionDBService.updateOrCreateTagPartitionInfo(servicesTestEnv.mockDistributedTransaction,existingTagPartitions,existingTag) //calling the funtion under test but have not provided mock for the repository's add method. The test passes! how? Shouldn't the test throw Null Pointer exception?
      val expectedResult = TagPartitions(existingTag,Set(newTagParitionInfo))
      verify(servicesTestEnv.mockPartitionsOfATagTransactionRepository,times(1))
        .add(servicesTestEnv.mockDistributedTransaction,expectedResult,new PutIfNotExists())
      result mustBe expectedResult
      result mustBe TagPartitions(existingTag,Set(newTagParitionInfo))
    }

各种mocks被定义为

val mockCredentialsProvider = mock(classOf[CredentialsProvider])
  val mockUserTokenTransactionRepository = mock(classOf[UserTokenTransactionRepository])
  val mockUserTransactionRepository = mock(classOf[UserTransactionRepository])
  val mockUserProfileAndPortfolioTransactionRepository = mock(classOf[UserProfileAndPortfolioTransactionRepository])
  val mockHelperMethods = mock(classOf[HelperMethods])
  val mockTransactionService = mock(classOf[TransactionService])
  val mockQuestionsCreatedByUserRepo = mock(classOf[QuestionsCreatedByAUserForATagTransactionRepository])
  val mockQuestionsAnsweredByUserRepo = mock(classOf[QuestionsAnsweredByAUserForATagTransactionRepository])
  val mockDistributedTransaction = mock(classOf[DistributedTransaction])
  val mockQuestionTransactionDBService = mock(classOf[QuestionsTransactionDatabaseService])
  val mockQuestionNonTransactionDBService = mock(classOf[QuestionsNonTransactionDatabaseService])
  val mockAnswersTransactionRepository = mock(classOf[AnswersTransactionRepository])
  val mockPartitionsOfATagTransactionRepository = mock(classOf[PartitionsOfATagTransactionRepository])
  val mockPracticeQuestionsTagsTransactionRepository = mock(classOf[PracticeQuestionsTagsTransactionRepository])
  val mockPracticeQuestionsTransactionRepository = mock(classOf[PracticeQuestionsTransactionRepository])
  val mockSupportedTagsTransactionRepository = mock(classOf[SupportedTagsTransactionRepository])
  val mockPartitionsOfATagRepository = mock(classOf[PartitionsOfATagRepository])

即使我没有为mock提供任何partitionsOfATagTransactionRepository.add,测试用例仍然通过。调用NullPointer方法时是否应该得到add异常。

我期望我需要编写doNothing().when(servicesTestEnv.mockPartitionsOfATagTransactionRepository).add(ArgumentMatchers.any[DistributedTransaction],ArgumentMatchers.any[TagPartitions],ArgumentMatchers.any[MutationCondition])when(servicesTestEnv.mockPartitionsOfATagTransactionRepository).add(ArgumentMatchers.any[DistributedTransaction],ArgumentMatchers.any[MutationCondition]).thenReturn(...)之类的东西才能通过测试用例。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)