使用 Spring Boot 2.7.3,我無法使用@WebMvcTest.
這是我的設定:
// GameServerApplicationTests.kt
@SpringBootTest
class GameServerApplicationTests {
@Test
fun contextLoads() { }
}
// CraftService.kt
@Service
class CraftService {
fun getAll(): List<String> {
return listOf("foo", "bar")
}
}
// CraftApiTest.kt
@WebMvcTest
@Import(value = [CraftService::class])
class CraftApiTest {
@Autowired
private lateinit var testRestTemplate: TestRestTemplate
@Test
fun `should do accept craft all endpoint`() {
val response = testRestTemplate.getForEntity("/craft/all", String::class.java)
assertThat(response.statusCode).isEqualTo(HttpStatus.OK)
}
}
當我運行測驗時,我看到了這個例外:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'itemRepository' defined in com.gameserver.item.ItemRepository defined in @EnableJpaRepositories declared on GameServerApplication: Cannot create inner bean '(inner bean)#3fba233d' of type [org.springframework.orm.jpa.SharedEntityManagerCreator] while setting bean property 'entityManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#3fba233d': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available
我完全不知道它為什么要尋找itemRepository豆子。我從來沒有要求過。
然后我添加了這個
@WebMvcTest
@ComponentScan(excludeFilters = [ComponentScan.Filter(Repository::class)]) // <<
@Import(value = [CraftService::class])
這導致了這個例外:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'playerRepository' defined in com.gameserver.player.PlayerRepository defined in @EnableJpaRepositories declared on GameServerApplication: Cannot create inner bean '(inner bean)#30c1da48' of type [org.springframework.orm.jpa.SharedEntityManagerCreator] while setting bean property 'entityManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#30c1da48': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available
這讓我更加困惑。我明確排除了所有@Repository豆類 - 但它只是跳過ItemRepository然后要求PlayerRepository現在。
我完全迷失了,不知道為什么我不能為我的 API 端點設定一個簡單的集成測驗。
編輯#1:
其他測驗運行良好:

編輯#2:
我嘗試將@Configurationbean 用于@Import.
// CraftApiTestConfiguration
@Configuration
class CraftApiTestConfiguration {
@Bean
fun getCraftService(): CraftService {
return CraftService()
}
}
// CraftApiTest.kt
@WebMvcTest
@Import(CraftApiTestConfiguration::class)
class CraftApiTest { // ... }
那也沒有幫助。它只是給了我上面提到的第二個例外(要求的那個playerRepository)
uj5u.com熱心網友回復:
我會嘗試回答,盡管沒有看到實際代碼它可能不正確。
因此,@WebMvcTest加載應用程式的“切片”,其中所有 bean 都用@RestControllers. 它不加載@Service或@Repository注釋 bean。
當您使用@WebMvcTest注釋運行測驗時,它將加載所有控制器,并且如果控制器意外參考了服務上的參考以外的其他內容(這里我不能確定它是什么),您最終可能會加載這些東西你實際上并不需要。
現在,當您使用時@WebMvcTest,您可以/應該做兩件事:
使用 MockMvc 而不是查詢 Web 服務器的 rest 模板,它無論如何都不是一個成熟的 Web 層測驗。
嘗試
@WebMvcTest僅與您的控制器一起使用:
@WebMvcTest(CraftApisController.class)
此外,您可以使用常規單元測驗(根本沒有spring,只是簡單的JUnit / Mockito)覆寫真正的服務實作,而不是注入服務的真正實作,@MockBean并且該測驗可以檢查您的注釋是否正確定義
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/506419.html
上一篇:SpringJPA保存父物件不保存子物件-已解決(在評論末尾)
下一篇:郵遞員請求越來越快
