当前位置: 首页 > 知识库问答 >
问题:

使用MockMvc和自动配置MockMvc测试Spring Boot Web应用程序时,LazyLaunalizationExctive的原因是什么

计向晨
2023-03-14

我正在尝试本教程中的几个单元测试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应用程序上下文?

共有1个答案

苏波涛
2023-03-14

解决方案是将@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测试这个方法?

  • 我的控制器是: 而且效果很好。但我不能测试它。我试过: 但它在以下方面失败了: 所以:如何测试?