Spring boot spring boot Test JpaRepository为空
我试图用spring引导应用程序执行JUnit测试restful,但这是错误的。但是如果我使用浏览器,它是好的 救命啊 存储库类: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
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());
}