gpt4 book ai didi

spring-mvc - 如何正确 Autowiring MockMvc bean

转载 作者:行者123 更新时间:2023-12-02 12:53:01 24 4
gpt4 key购买 nike

我在这方面有点麻烦。

我正在尝试测试我的 Spring boot 应用程序的 Web 层(使用 JUnit5)。
我正在使用 @WebMvcTest(NoteController::class) 来允许我 Autowiring MockMvc 以模拟请求。

但我得到以下错误:
kotlin.UninitializedPropertyAccessException:lateinit 属性 mvc 尚未初始化

NoteControllerTest

import org.hamcrest.Matchers.`is`
import org.junit.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest
import org.springframework.http.MediaType
import org.springframework.test.context.junit.jupiter.SpringExtension
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post
import org.springframework.test.web.servlet.result.MockMvcResultMatchers.*

@ExtendWith(SpringExtension::class)
@WebMvcTest(NoteController::class)
class NoteControllerTest {

@Autowired
private lateinit var mvc: MockMvc

@Test
fun should_create_a_note() {
mvc.perform(
post("/notes"))
.andExpect(status().isCreated)
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andExpect(jsonPath("$.content", `is`("my content")))
}
}

笔记 Controller

import fr.$$.$$.api.CreateNote
import fr.$$.$$.api.FetchNote
import fr.$$.$$.resources.Note
import fr.$$.$$.resources.toResource
import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RestController
import java.net.URI

@RestController("/notes")
class NoteController(val createNote: CreateNote,
val fetchNote: FetchNote) {

@GetMapping
fun getAllNotes(): ResponseEntity<List<Note>> {
return ResponseEntity(fetchNote.all().toResource(), HttpStatus.OK)
}

@PostMapping
fun createNote(): ResponseEntity<Note> {
val note = createNote.with("my content").toResource()
return ResponseEntity.created(URI("")).body(note)
}
}

SmartNotesApplicationTest

import org.junit.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT
import org.springframework.test.context.junit.jupiter.SpringExtension

@ExtendWith(SpringExtension::class)
@SpringBootTest(webEnvironment = RANDOM_PORT)
class SmartNotesApplicationTest {

@Test
fun contextLoad() {

}
}

提前致谢。

最佳答案

我注入(inject) WebApplicationContext,然后为每个测试构建一个新的 MockMvc

@SpringBootTest
class SomeTest {

@Autowired
lateinit var webApplicationContext: WebApplicationContext
lateinit var mockMvc: MockMvc

@BeforeEach
fun beforeEach() {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build()
}

// Tests go here!
}

关于spring-mvc - 如何正确 Autowiring MockMvc bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56877121/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com