Spring 启动测试无法解析存储库依赖性
Spring Boot Test cannot resolve repository dependency
我有一个 UserRepository,它是一个 CRUD 存储库,如图所示:
@Repository
public interface UserRepository extends CrudRepository<User, Long> {
}
像这样的一个 UserController:
@RestController
@RequestMapping("/api")
public class UserController {
@Autowired
private UserRepository repository;
@Autowired
private UserResourceAssembler assembler;
和一个 WebMvcTest class 来测试我的 UserController:
@RunWith(SpringRunner.class)
@WebMvcTest(UserController.class)
public class UserControllerTest {
@Autowired
private MockMvc mvc;
@Test
public void getAllEmployeesAPI() throws Exception
{
mvc.perform( MockMvcRequestBuilders
.get("/api/users")
.accept(MediaType.APPLICATION_JSON))
.andDo(print())
.andExpect(status().isOk());
}
}
当我运行服务器一切正常。但是,当我 运行 maven-test:
时出现此错误
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by:
org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'userController': Unsatisfied dependency
expressed through field 'repository'; nested exception is
org.springframework.beans.factory.BeanCreationException: Error
creating bean with name 'userRepository': Cannot create inner bean
'(inner bean)#7ba1cdbe' 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)#7ba1cdbe': Cannot resolve
reference to bean 'entityManagerFactory' while setting constructor
argument; nested exception is
org.springframework.beans.factory.NoSuchBeanDefinitionException: No
bean named 'entityManagerFactory' available Caused by:
org.springframework.beans.factory.BeanCreationException: Error
creating bean with name 'userRepository': Cannot create inner bean
'(inner bean)#7ba1cdbe' 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)#7ba1cdbe': Cannot resolve
reference to bean 'entityManagerFactory' while setting constructor
argument; nested exception is
org.springframework.beans.factory.NoSuchBeanDefinitionException: No
bean named 'entityManagerFactory' available Caused by:
org.springframework.beans.factory.BeanCreationException: Error
creating bean with name '(inner bean)#7ba1cdbe': Cannot resolve
reference to bean 'entityManagerFactory' while setting constructor
argument; nested exception is
org.springframework.beans.factory.NoSuchBeanDefinitionException: No
bean named 'entityManagerFactory' available Caused by:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No
bean named 'entityManagerFactory' available
如果你现在有相同的结构,我推荐@SpringBootTest
。
@WebMvcTest
不会将与数据库相关的 bean 加载到应用程序上下文中。
@WebMvcTest
只加载 Web 层。如果它包含一些依赖项,您还需要加载您的应用程序上下文。您可以使用 @ContextConfiguration(classes = {YouTestConfiguration.class})
缩小仅在您的控制器中使用的依赖项
我有一个 UserRepository,它是一个 CRUD 存储库,如图所示:
@Repository
public interface UserRepository extends CrudRepository<User, Long> {
}
像这样的一个 UserController:
@RestController
@RequestMapping("/api")
public class UserController {
@Autowired
private UserRepository repository;
@Autowired
private UserResourceAssembler assembler;
和一个 WebMvcTest class 来测试我的 UserController:
@RunWith(SpringRunner.class)
@WebMvcTest(UserController.class)
public class UserControllerTest {
@Autowired
private MockMvc mvc;
@Test
public void getAllEmployeesAPI() throws Exception
{
mvc.perform( MockMvcRequestBuilders
.get("/api/users")
.accept(MediaType.APPLICATION_JSON))
.andDo(print())
.andExpect(status().isOk());
}
}
当我运行服务器一切正常。但是,当我 运行 maven-test:
时出现此错误java.lang.IllegalStateException: Failed to load ApplicationContext Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController': Unsatisfied dependency expressed through field 'repository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': Cannot create inner bean '(inner bean)#7ba1cdbe' 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)#7ba1cdbe': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': Cannot create inner bean '(inner bean)#7ba1cdbe' 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)#7ba1cdbe': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#7ba1cdbe': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available
如果你现在有相同的结构,我推荐@SpringBootTest
。
@WebMvcTest
不会将与数据库相关的 bean 加载到应用程序上下文中。
@WebMvcTest
只加载 Web 层。如果它包含一些依赖项,您还需要加载您的应用程序上下文。您可以使用 @ContextConfiguration(classes = {YouTestConfiguration.class})