如何将@SpringBootTest(webEnvironment)与@DataJpaTest一起使用?

时间:2019-08-22 12:52:57

标签: java spring jpa testing jax-rs

我正在尝试测试JAX-RS应用程序,但我不想模拟数据,特别是因为现有的buildData有一个@DataJpaTest方法

这是我到目前为止正在尝试的:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(
    webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
    classes = MyApp.class
)
@DirtiesContext
@DataJpaTest
public class MyResourceTest {

我收到以下错误

  

java.lang.IllegalStateException:配置错误:为测试类[app.MyResourceTest]找到了@BootstrapWith的多个声明:[@ org.springframework.test.context.BootstrapWith(value = class org.springframework.boot.test。 context.SpringBootTestContextBootstrapper),@ org.springframework.test.context.BootstrapWith(value = class org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTestContextBootstrapper)]

我看到的其他类似的对象并没有谈论webEnvironment设置:

有些使用@AutoConfigureTestDatabase的解决方案,但是当我这样做时,只有第一个可行,因为buildData@Before注释(与@DataJpaTest相同)是我希望每次测试之前数据都是原始的,这样我就可以进行故障处理。

切换到@BeforeClass也不起作用,因为我将无法使用@Autowire Repository对象。

2 个答案:

答案 0 :(得分:2)

@DataJpaTest文档指出以下内容:

  

如果您希望加载完整的应用程序配置,但使用的是嵌入式数据库,则应考虑将@SpringBootTest@AutoConfigureTestDatabase结合使用,而不要使用此注释。


请记住,@DataJpaTest@Transactional@DirtiesContext进行了注释。因此,您可能需要这些注释以及@AutoConfigureTestDatabase

答案 1 :(得分:0)

实际上,当在https://stackoverflow.com/a/57609911/242042中回答时,它可以解决当前的问题,但是您将无法使用REST客户端进行涉及数据库的任何测试,因为@Transactional将阻止数据保存下来供客户获取。

要使其正常工作,请勿使用@Transactional。相反,应该使用DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD。这样会大大降低每次测试的速度(每次测试会在1秒到10秒内),但至少能起作用。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(
    webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
    classes = MyApp.class
)
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
@AutoConfigureTestDatabase
@AutoConfigureWebTestClient
public class MyResourceTest {

    @Autowired
    private TestRestTemplate restTemplate;

    ...

}