сервис насмешек не работает, когда вызывается конечная точка с помощью spring boot и cucumber

#spring-boot #kotlin #cucumber

Вопрос:

Я пытаюсь издеваться над одной службой, когда я вызываю конечную точку в тесте, я использую spring boot с огурцом, и я хотел бы издеваться над своей службой, но я всегда получаю взамен реальный объект, но макет работает нормально, когда я вызываю службу непосредственно из теста, я создал образец, чтобы проверить, можете ли вы помочь, это мой тестовый класс

 package com.example.demo

import com.example.demo.service.DemoService
import io.cucumber.java.en.Then
import io.cucumber.java.en.When
import io.cucumber.spring.CucumberTestContext.SCOPE_CUCUMBER_GLUE
import io.restassured.RestAssured
import io.restassured.module.mockmvc.response.MockMvcResponse
import io.restassured.module.mockmvc.specification.MockMvcRequestSpecification
import org.mockito.BDDMockito.given
import org.mockito.Mockito
import org.mockito.Mockito.mock
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureWebMvc
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.web.server.LocalServerPort
import org.springframework.context.annotation.Scope
import org.springframework.http.MediaType
import org.springframework.test.context.ContextConfiguration
import org.springframework.test.web.servlet.MockMvc
import org.springframework.web.context.WebApplicationContext
import org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get



@ContextConfiguration(classes = [DemoApplication::class])
@Scope(SCOPE_CUCUMBER_GLUE)
class Steps {

    @LocalServerPort
    var port: Int = 0

    var demoService: DemoService = mock(DemoService::class.java)

    @Autowired
    private val webApplicationContext: WebApplicationContext? = null


    @When("call the end point")
    fun callTheEndPoint() {
        val msg: Message = Message(id = "2", text = "test")
        Mockito.`when`(demoService.getMessage()).thenReturn(msg)
        RestAssured.port = port
        RestAssured.baseURI = "http://localhost"
       var res = RestAssured.`when`().get("/").then().extract().body().`as`(Message::class.java)
        println("When is called: "   res.text)
    }

    @Then("retrieve these data")
    fun retrieveData() {
        println("Then is called")
    }
}
 

это мой отдых.

 package com.example.demo

import com.example.demo.service.DemoService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController

@SpringBootApplication
class DemoApplication

fun main(args: Array<String>) {
    runApplication<DemoApplication>(*args)
}

data class Message(val id: String?, val text: String)

@RestController
class MessageResource {
    @Autowired
    lateinit var demoService: DemoService

    @GetMapping
    fun index(): Message = demoService.getMessage()

}
 

это моя услуга

 package com.example.demo.service

import com.example.demo.Message
import org.springframework.stereotype.Service

@Service
class DemoService {
    fun getMessage(): Message  = Message(id = "1", text = "qwerty")
}
 

Ответ №1:

 var demoService: DemoService = mock(DemoService::class.java)
 

Это также не сработало бы в тесте JUnit. Ты создаешь насмешку над DemoService собой Steps . Ваше приложение spring никоим образом не может использовать созданный вами экземпляр и использовать его в качестве компонента.

С JUnit вы бы использовали:

 @SpringBootTest
class ExampleTest {
   @MockBean
   DemoService demoService;
}
 

И с огурцом:

 @SpringBootTest
@CucumberContextConfiguration
public class CucumberSpringConfiguration {
   @MockBean
   DemoService demoService;
}
 

@CucumberContextConfiguration Аннотация важна. Он сообщает Cucumber, что он должен использовать CucumberSpringConfiguration класс для создания контекста тестового приложения.