मैं एक आरईएसटी नियंत्रक का परीक्षण कर रहा हूं, और मैं नकली सेवा इंजेक्ट करना चाहता हूं।

लेकिन सेवा Mock . को कॉल करते समय मुझे शून्य मान मिल रहा है

यह मेरा कोड है:

इंटरफेस:

interface CaseManagementService {
fun createAccount(caseRequest: CaseRequestDto): Mono<CaseResponseDto>
} 

सेवा:

@Service
class CaseManagementServiceImpl(private val clientManagementService: 
ClientManagementService) : CaseManagementService {

   override fun createAccount(caseRequest: CaseRequestDto): Mono<CaseResponseDto> {
    return clientManagementService.createAccount(caseRequest)
  }
}

नियंत्रक:

@RestController
@RequestMapping("somepath")
class CaseController(private val caseManagementService: CaseManagementService) {

@PostMapping()
fun createCase(@RequestBody caseRequest: CaseRequestDto): Mono<CaseResponseDto> {
    return caseManagementService.createAccount(caseRequest)    }
}

कसौटी:

@SpringBootTest
class CaseControllerTests {
@Test
fun `createCase should return case id when a case is created`() {

    val caseManagementService: CaseManagementServiceImpl =   
    Mockito.mock(CaseManagementServiceImpl::class.java)

    val caseResponseDtoMono = Mono.just(Fakes().GetFakeCaseResponseDto())
    val requestDto = Fakes().GetFakeCaseRequestDto()

     
    `when`(caseManagementService.createAccount(requestDto).thenReturn(caseResponseDtoMono))

    var caseController = CaseController(caseManagementService)

//NULL EXCEPTION HAPPENS HERE - RETURNS NULL THIS CALL
    var result = caseController.createCase(Fakes().GetFakeCaseRequestDto())

    StepVerifier.create(result)
        .consumeNextWith { r -> assertEquals(Fakes().GetFakeCaseResponseDto().id, r.id) 
    }.verifyComplete()
  }
 } 
0
D.B 12 अक्टूबर 2020, 17:00

2 जवाब

सबसे बढ़िया उत्तर

क्लोजिंग ब्रैकेट गलत जगह पर है: आप मॉकिटो के thenReturn के बजाय Mono.thenReturn (createAccount से लौटाए गए एक नल मोनो इंस्टेंस पर) को कॉल कर रहे हैं (मुझे लगता है कि आपका यही मतलब है):

`when`(caseManagementService.createAccount(requestDto)).thenReturn(caseResponseDtoMono)

दूसरी समस्या: आप CaseRequestDto के विशिष्ट उदाहरण के लिए createAccount कॉल का मज़ाक उड़ा रहे हैं। वास्तविक कॉल में आप अलग-अलग उदाहरण का उपयोग कर रहे हैं, इसलिए तर्क मेल नहीं खाते हैं और नकली शून्य हो जाता है। अनुरोध उदाहरण का पुन: उपयोग करने का प्रयास करें, अर्थात:

var result = caseController.createCase(requestDto)
0
Mafor 12 अक्टूबर 2020, 17:37

आपने सेवा का मज़ाक उड़ाया है लेकिन बाकी नियंत्रक में नकली सेवा को इंजेक्ट नहीं किया है। इसलिए आपको एक शून्य सूचक मिल रहा है। तो, CaseManagementService को CaseController में इंजेक्ट करने की आवश्यकता है। नीचे एक लिंक है जहां आप इंजेक्शन वाले हिस्से को देख सकते हैं। नीचे दिए गए कोड में मैंने केसकंट्रोलर वैरिएबल को ऊपर ले जाया है ताकि केस मैनेजमेंट सर्विस को केस कंट्रोलर में इस्तेमाल करने से पहले इंजेक्ट किया जा सके।

@SpringBootTest
class CaseControllerTests {
@Test
fun `createCase should return case id when a case is created`() {

    val caseManagementService: CaseManagementServiceImpl =   
    Mockito.mock(CaseManagementServiceImpl::class.java)
    var caseController = CaseController(caseManagementService)

    val caseResponseDtoMono = Mono.just(Fakes().GetFakeCaseResponseDto())
    val requestDto = Fakes().GetFakeCaseRequestDto()

     
    `when`(caseManagementService.createAccount(requestDto).thenReturn(caseResponseDtoMono))

   
//NULL EXCEPTION HAPPENS HERE - RETURNS NULL THIS CALL
    var result = caseController.createCase(Fakes().GetFakeCaseRequestDto())

    StepVerifier.create(result)
        .consumeNextWith { r -> assertEquals(Fakes().GetFakeCaseResponseDto().id, r.id) 
    }.verifyComplete()
  }
 } 

https://vmaks.github.io/other/2019/11/04/spring-boot-with-mockito-and-kotlin.html

0
Heena Tabassum 12 अक्टूबर 2020, 17:37