#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
класс для создания контекста тестового приложения.