如何在使用Mockito进行模拟测试时解决NullpointerException?

huangapple go评论119阅读模式
英文:

How to solve NullpointerException while testing mocked using mockito?

问题

  1. **如何在使用 mockito 进行模拟测试时解决类型为 <List<NodeInfo>> nodeInfoList.map { it.legalIdentities.last().name } 引发的 NullpointerException 问题**
  2. **## 待测试的服务代码 ##**
  3. ```kotlin
  4. val nodeInfoList = dataService.proxy.networkMapSnapshot()
  5. val nodeNameList = nodeInfoList.map { it.legalIdentities.last().name }
  6. ownerMap.map {
  7. if (nodeNameList.contains(CordaX500Name.parse(it.value))) {
  8. ownerList.add(it.key)
  9. }
  10. }
  11. maintanenceMap.map {
  12. if (nodeNameList.contains(CordaX500Name.parse(it.value))) {
  13. maintainerList.add(it.key)
  14. }
  15. }
  16. response["ownerList"] = ownerList
  17. response["maintainerList"] = maintainerList
  18. return ResponseEntity.status(200).body(response)

# 我编写的测试函数 #

  1. @Test(timeout = 300000)
  2. fun `测试获取下拉数据`() {
  3. val cordaRPCOps = Mockito.mock(CordaRPCOps::class.java)
  4. val listNodeInfoMock = Mockito.mock(List::class.java) as List<net.corda.core.node.NodeInfo>
  5. val singleMockNodeInfo = Mockito.mock(net.corda.core.node.NodeInfo::class.java)
  6. val x500Name = CordaX500Name.parse("O=Building Owner1,L=Tokyo,C=JP")
  7. val list500Mock2 = listOf(x500Name)
  8. Mockito.`when`(cordaDataService!!.proxy).thenReturn(cordaRPCOps)
  9. Mockito.`when`(cordaRPCOps.networkMapSnapshot()).thenReturn(listNodeInfoMock)
  10. Mockito.`when`(listNodeInfoMock.map { it.legalIdentities.last().name }).thenReturn(list500Mock2)
  11. Mockito.`when`(list500Mock2.contains(CordaX500Name.parse("O=Building Owner1,L=Tokyo,C=JP"))).thenReturn(true)
  12. val dropDownData = staticDataService!!.getDropDownData()
  13. println("dropDownData " + dropDownData)
  14. }
  1. <details>
  2. <summary>英文:</summary>
  3. **How to solve NullpointerException nodeInfoList.map { it.legalIdentities.last().name } where nodeInfoList is of type &lt;List&lt;NodeInfo&gt;&gt; while testing mocked using mockito?**
  4. **## Service code to be tested ##**
  5. val nodeInfoList=dataService.proxy.networkMapSnapshot()
  6. val nodeNameList =nodeInfoList.map { it.legalIdentities.last().name }
  7. ownerMap.map {
  8. if(nodeNameList.contains(CordaX500Name.parse(it.value))) {
  9. ownerList.add(it.key)
  10. }
  11. }
  12. maintanenceMap.map {
  13. if(nodeNameList.contains(CordaX500Name.parse(it.value))) {
  14. maintainerList.add(it.key)
  15. }
  16. }
  17. response[&quot;ownerList&quot;] = ownerList
  18. response[&quot;maintainerList&quot;] = maintainerList
  19. return ResponseEntity.status(200).body(response)
  20. }
  21. **#Test function I wrote #**
  22. @Test(timeout = 300000)
  23. fun ` get drop down data Test`() {
  24. val cordaRPCOps = Mockito.mock(CordaRPCOps::class.java)
  25. val listNodeInfoMock = Mockito.mock(listOf&lt;net.corda.core.node.NodeInfo&gt;()::class.java)
  26. val singleMockNodeInfo = Mockito.mock(net.corda.core.node.NodeInfo::class.java)
  27. val x500Name = CordaX500Name.parse(&quot;O=Building Owner1,L=Tokyo,C=JP&quot;)
  28. val list500Mock2 = listOf(x500Name)
  29. Mockito.`when`(cordaDataService!!.proxy).thenReturn(cordaRPCOps)
  30. Mockito.`when`(cordaRPCOps.networkMapSnapshot()).thenReturn(listNodeInfoMock)
  31. Mockito.`when`(listNodeInfoMock.map { it.legalIdentities.last().name }).thenReturn(list500Mock2)
  32. Mockito.`when`(list500Mock2.contains(CordaX500Name.parse(&quot;O=Building Owner1,L=Tokyo,C=JP&quot;))).thenReturn(true)
  33. val dropDownData = staticDataService!!.getDropDownData()
  34. println(&quot;dropDownData &quot; + dropDownData)
  35. }
  36. </details>
  37. # 答案1
  38. **得分**: 1
  39. 我认为这取决于您测试的目标,以及您是否期望该列表为null,以及您是否想要对其进行测试。一般来说,使用Mockito处理空列表有许多方法,您可以查看这个[其他帖子][1],并了解哪种方法最适合您的目的。
  40. [1]: https://stackoverflow.com/questions/40032794/use-mockito-to-match-a-null-list-of-a-specific-type
  41. <details>
  42. <summary>英文:</summary>
  43. I think it depends on the goal of your tests, whether you expect that list to be null or not and if you want to test it. In general, there are many ways to handle null lists with Mockito, you can see this [other post][1], for example, and see what fits best with your purpose.
  44. [1]: https://stackoverflow.com/questions/40032794/use-mockito-to-match-a-null-list-of-a-specific-type
  45. </details>
  46. # 答案2
  47. **得分**: 0
  48. ```kotlin
  49. fun ` list data Test`() {
  50. val x500Name = CordaX500Name.parse("O=Maintenance Operator1,L=Tokyo,C=JP")
  51. val partyMock = Mockito.mock(Party::class.java)
  52. Mockito.`when`(cordaDataService!!.proxy).thenReturn(proxyMock)
  53. Mockito.`when`(proxyMock!!.networkMapSnapshot()).thenReturn(listNodeInfoMock)
  54. Mockito.`when`(listNodeInfoMock!!.iterator()).thenReturn(nodeInfoIterator)
  55. Mockito.`when`(nodeInfoIterator!!.hasNext()).thenReturn(true, false)
  56. Mockito.`when`(nodeInfoIterator.next()).thenReturn(nodeInfoMock).thenReturn(nodeInfoMock2)
  57. Mockito.`when`(nodeInfoMock!!.legalIdentities).thenReturn(listOf(partyMock))
  58. Mockito.`when`(nodeInfoMock.legalIdentities.last().name).thenReturn(x500Name)
  59. Mockito.`when`(list500Mock2!!.contains(x500Name)).thenReturn(true)
  60. }
  61. // Rewritten test function like this. Nullpointer exception solved. Used @Mock for some of the mockobjects used here.
  62. @InjectMocks
  63. private val staticDataService: StaticDataService? = null
  64. @Mock
  65. private val cordaDataService: CordaDataService? = null
  66. @Mock
  67. private val proxyMock: CordaRPCOps? = null
  68. @Mock
  69. private val listNodeInfoMock: List<NodeInfo>? = null
英文:
  1. fun ` list data Test`() {
  2. val x500Name = CordaX500Name.parse(&quot;O=Maintenance Operator1,L=Tokyo,C=JP&quot;)
  3. val partyMock = Mockito.mock(Party::class.java)
  4. Mockito.`when`(cordaDataService!!.proxy).thenReturn(proxyMock)
  5. Mockito.`when`(proxyMock!!.networkMapSnapshot()).thenReturn(listNodeInfoMock)
  6. Mockito.`when`(listNodeInfoMock!!.iterator()).thenReturn(nodeInfoIterator)
  7. Mockito.`when`(nodeInfoIterator!!.hasNext()).thenReturn(true,false)
  8. Mockito.`when`(nodeInfoIterator.next()).thenReturn(nodeInfoMock).thenReturn(nodeInfoMock2)
  9. Mockito.`when`(nodeInfoMock!!.legalIdentities ).thenReturn(listOf(partyMock))
  10. Mockito.`when`(nodeInfoMock.legalIdentities.last().name ).thenReturn(x500Name)
  11. Mockito.`when`(list500Mock2!!.contains(x500Name)).thenReturn(true)
  12. }

> Rewritten test function like this. Nullpointer exception solved.Used @Mock for some of the mockobjects used here.

  1. @InjectMocks
  2. private val staticDataService: StaticDataService? = null
  3. @Mock
  4. private val cordaDataService: CordaDataService? = null
  5. @Mock
  6. private val proxyMock: CordaRPCOps? = null
  7. @Mock
  8. private val listNodeInfoMock: List&lt;NodeInfo&gt;? = null

huangapple
  • 本文由 发表于 2020年8月17日 20:41:19
  • 转载请务必保留本文链接:https://go.coder-hub.com/63451036.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定