Spring boot spring boot Test JpaRepository为空

Spring boot spring boot Test JpaRepository为空,spring-boot,spring-data-jpa,Spring Boot,Spring Data Jpa,我试图用spring引导应用程序执行JUnit测试restful,但这是错误的。但是如果我使用浏览器,它是好的 救命啊 存储库类: package com.zhx.help.dao; import com.zhx.help.model.Girl; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import javax

我试图用spring引导应用程序执行JUnit测试restful,但这是错误的。但是如果我使用浏览器,它是好的

救命啊

存储库类:

package com.zhx.help.dao;

import com.zhx.help.model.Girl;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import javax.transaction.Transactional;
import java.util.List;


@Repository
@Transactional
public interface GirlRepository extends JpaRepository<Girl,Integer> {
  List<Girl> findByAge(Integer age);
代码

您不应使用新的创建控制器对象。。 您可以执行以下操作:

@InjectMocks
private GirlController girlController;

mvc = MockMvcBuilders.standaloneSetup(girlController).build();

您可以避免模拟存储库类。相反,创建一个服务类并模拟它并访问服务类中的存储库类

使用当前方法,您基本上是在使
@springbootest
无用。您正在加载所有内容,在设置中要做的第一件事基本上就是放弃所有结果

通过自动连接
MockMvc
来使用启动的上下文,或者使用Mockito创建一个简单的单元测试

使用预配置的
MockMVC
通过简单地在
MockMvc
字段中添加
@Autowired
,您应该能够获得准备好的实例,并且您可以简单地删除
设置
方法

@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
public class GirlControllerTest {

private static Logger log =          LoggerFactory.getLogger(GirlControllerTest.class);

 //模拟对象
 @Autowired
 private MockMvc mvc;

 @MockBean
 private GirlRepository girlRepository;

@Test
public void girlList() throws Exception {
    RequestBuilder request = MockMvcRequestBuilders.get("/girls");
    mvc.perform(request).andExpect(status().isOk());
}
创建一个简单的单元测试,而不是集成测试 另一种选择是不加载整个上下文,直接使用Mockito和您现在拥有的
standaloneSetup

@RunWith(MockitoJUnitRunner.class)
public class GirlControllerTest {

private static Logger log =          LoggerFactory.getLogger(GirlControllerTest.class);

 //模拟对象
 private MockMvc mvc;

 @Mock
 private GirlRepository girlRepository;

 @InjectMocks
 private GirlController girlController;

 @Before
 public void setUp() {
     mvc = MockMvcBuilders.standaloneSetup(girlController).build();
}

@Test
public void girlList() throws Exception {
    RequestBuilder request = MockMvcRequestBuilders.get("/girls");
    mvc.perform(request).andExpect(status().isOk());
}
任何一种方法都可以,您需要/想要什么取决于您的需要和您想要什么(只需测试控制器或使其成为一个巨大的集成测试)


注意:您正在扩展
MockMvcResultHandlers
不要扩展该类,只需使用静态导入即可。

请发布包含stacktrace的日志。只需
@Autowire
MockMvc
而不是自己创建它。您可以使用spring托管实例,也可以不使用。您正在测试中启动应用程序,然后不使用它(因为您使用了
新的GirlController()
并使用了
标准安装程序
。因此,您基本上忽略了使用
@SpringBootTest
设置的所有内容。
@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
public class GirlControllerTest {

private static Logger log =          LoggerFactory.getLogger(GirlControllerTest.class);

 //模拟对象
 @Autowired
 private MockMvc mvc;

 @MockBean
 private GirlRepository girlRepository;

@Test
public void girlList() throws Exception {
    RequestBuilder request = MockMvcRequestBuilders.get("/girls");
    mvc.perform(request).andExpect(status().isOk());
}
@RunWith(MockitoJUnitRunner.class)
public class GirlControllerTest {

private static Logger log =          LoggerFactory.getLogger(GirlControllerTest.class);

 //模拟对象
 private MockMvc mvc;

 @Mock
 private GirlRepository girlRepository;

 @InjectMocks
 private GirlController girlController;

 @Before
 public void setUp() {
     mvc = MockMvcBuilders.standaloneSetup(girlController).build();
}

@Test
public void girlList() throws Exception {
    RequestBuilder request = MockMvcRequestBuilders.get("/girls");
    mvc.perform(request).andExpect(status().isOk());
}