我正在尝试使用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());
}
答案 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
不要扩展该类,而只使用静态导入。