spring-boot Test JpaRepository为null

时间:2017-03-17 08:45:02

标签: spring-boot spring-data-jpa

我正在尝试使用Spring启动应用程序执行JUnit测试,但这是错误的。但如果我使用浏览器就可以了!

帮助。

存储库类:

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);

}

控制器类

package com.zhx.help.controller;

import com.zhx.help.dao.GirlRepository;
import com.zhx.help.model.Girl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
public class GirlController {

@Autowired
private GirlRepository girlRepository;

/**查询所有女生列表*/
@GetMapping(value = "/girls")
public List<Girl> girlList(){
    return girlRepository.findAll();
}

JUnit:

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

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

 //模拟对象
 private MockMvc mvc;

 @MockBean
 private GirlRepository girlRepository;

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

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

代码 https://github.com/longfeizheng/springboot-oracle.git

2 个答案:

答案 0 :(得分:0)

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

@InjectMocks
private GirlController girlController;

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

您可以避免模拟存储库类。而是创建一个服务类并模拟它并访问服务类

中的Repository类

答案 1 :(得分:0)

使用您当前的方法,您基本上渲染@SpringBootTest无用。你正在加载一切,你在设置中做的第一件事基本上是丢弃所有的结果。

通过自动装配MockMvc来使用已启动的上下文,或使用Mockito创建一个简单的单元测试。

使用预先配置的MockMVC

只需在@Autowired字段上添加MockMvc即可获得准备好的实例,您只需删除setup方法即可。

@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不要扩展该类,而只使用静态导入。