我正在尝试测试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
对象。
答案 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;
...
}