我正在尝试本教程中的几个单元测试Spring Boot MVC的例子-https://spring.io/guides/gs/testing-web/.我的项目有Spring Boot MVC和JPA(https://github.com/shankarps/SfgUdemyRecipes)
被测试的控制器检索配方实体列表,这些实体与类别实体有多对多映射。
@RequestMapping({"", "/", "/index"})
public String getIndexPage(Model model){
log.info("Getting all recipes");
model.addAttribute("recipes", recipeService.getAllRecipes());
return "index";
}
该控制器在Spring Boot应用程序启动时工作。食谱列表显示在浏览器中。
这个带有SpringBootTest和TestRestTemboard的测试用例按预期工作。
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class IndexControllerHttpTest {
@LocalServerPort
private int port;
@Autowired
private TestRestTemplate restTemplate;
@Test
public void testIndexUrl(){
String response = this.restTemplate.getForObject("http://localhost:"+port+"/", String.class);
}
}
然而,当我用MockMVC运行一个测试用例,将控制器作为一个MVC对象(用@AutoConfigureMockMvc)进行测试,而不使用Http服务器时,我得到了org。冬眠LazyInitializationException
异常。
@SpringBootTest
@AutoConfigureMockMvc
public class IndexControllerMockMVCTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testIndexControllerView() throws Exception {
this.mockMvc.perform(MockMvcRequestBuilders.get("/")).andExpect(status().isOk());
}
}
下面是完整的异常堆栈跟踪:
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.shankar.sfg.recipes.recipes.domain.Category.recipes, could not initialize proxy - no Session
at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:606)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:218)
at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:585)
at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:149)
at org.hibernate.collection.internal.PersistentSet.toString(PersistentSet.java:327)
at java.lang.String.valueOf(String.java:2994)
这看起来像是事务范围的问题。有人能帮忙找到根本原因吗?当作为一个完整的Web应用程序(使用@SpringBootTest)进行测试时,与在MVC层(@SpringBootTest和@AutoConfigureMockMvc)进行测试相比,需要什么额外的配置来测试Spring应用程序上下文?
解决方案是将@Transactional添加到名为Mock MVC的测试方法中。
@Test
@Transactional
public void testIndexControllerView() throws Exception {
this.mockMvc.perform(MockMvcRequestBuilders.get("/")).andExpect(status().isOk());
}
这个答案处理了单元测试JPA存储库对象的类似问题。
无法初始化代理-没有会话
我还不确定为什么在测试没有HTTP服务器的控制器时需要事务范围。
我试图在spring boot 2.3项目中使用JUnit5与Hibernate5.4和MockMvc。 这就是我的实体类的成员的外观: 我试图使用JUnit5用Mockito和MockMvc测试LocalDate字段birthDate。这就是测试用例的样子: 运行测试用例时,我得到一个AssertionError: 正如您所看到的,这两个字符串表示形式是相同的。但是JUnit5会抛出错误。 那么
我试图用以下代码测试Spring MVC控制器的错误响应 但是测试失败,异常是:。 当我卷曲这个URL时,我得到以下信息: 有人能帮我理解我做错了什么吗?
我试图使用spring和mockito对rest控制器进行单元测试。这是我的主控制器方法。 这是我的JUnit测试: 在输出响应中,测试失败,因为它得到404错误,但它预期成功代码为200。我相信我已经正确设置了独立配置,我会做错什么。为什么URI没有正确映射到方法?请注意,对于来自应用程序前端的相同URI,它工作正常。以下是我使用Postman工具为chrome测试的正确200响应的完整URI:
我正在使用spock框架为Spring 3控制器类编写测试。我在尝试执行其中一个测试(GET请求)时收到以下错误。请注意,同一类中的所有其他测试(POST请求)都按预期工作。 控制器签名 斯波克试验 组织。springframework。网状物util。NestedServletException:请求处理失败;嵌套的异常是java。lang.IllegalArgumentException:参数
ObjectBean类 所以我的问题是:我如何使用Spring mockMVC测试这个方法?
我的控制器是: 而且效果很好。但我不能测试它。我试过: 但它在以下方面失败了: 所以:如何测试?