2

我正在使用 Spring Rest Docs 为我的 REST 服务生成文档。这涉及运行单元(严格集成)测试,这些测试针对由测试启动的活动 Spring Boot 容器运行。测试类如下所示:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = MySpringConfiguration.class)
@WebAppConfiguration
public class ApiDocumentation {

  private MockMvc mockMvc;

  @Rule
  public final JUnitRestDocumentation restDocumentation = new JUnitRestDocumentation("target/generated-snippets");

  @Autowired
  private WebApplicationContext context;

  @Autowired
  private ObjectMapper objectMapper;

  @Before
  public void setUp() {
      this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
            .apply(documentationConfiguration(this.restDocumentation))
            .build();
  }


  @Test
  public void testSomething() throws Exception {
  }
}

该应用程序使用 JPA 和 EclipseLink 来实现 EntityManager。

当我在我的 IDE 中独立运行测试时,或者作为我使用 maven-surefire-plugin 运行 Maven 构建时唯一存在的测试时,一切正常。

然而,这不是我想在套件中运行的唯一测试。一旦我在套件中运行其他测试,我就会遇到这里提到的问题,即

“Spring 的代理在应用访问 Spring 上下文之前不会初始化持久化上下文。如果应用在访问 Spring 上下文之前已经触发了持久化类的加载,则不会发生编织。”

并得到这样的错误:

异常描述:方法 [_persistence_set_someField_vh] 或 [_persistence_get_someField_vh] 未在对象 [mypackage.MyEntity] 中定义。

那么人们通常会做什么来解决这个问题呢?在不同的模块中运行 SpringBootTest 类来单元测试访问实体?

4

2 回答 2

1

就我所关心的动态编织引起的问题而言,如果将其设为静态,它应该可以正常工作。可能对有帮助

于 2016-10-06T09:05:58.430 回答
1

另一种解决方案可能是使用eclipselink.weavingJPA 属性在该特定测试中禁用动态编织。

请参阅此问题及其答案:@SpringBootTest 干扰 EclipseLink 动态编织

于 2020-02-17T08:45:41.500 回答