Spring 测试 + DBUnit 无法加载数据集
Spring test + DBUnit Unable to load DataSet
我正在尝试在我的 Spring 引导应用程序中编写集成测试。我在正确设置设置配置时遇到问题。抛出以下异常:
java.lang.IllegalArgumentException: Unable to load dataset from "sampleData.xml" using class com.github.springtestdbunit.dataset.FlatXmlDataSetLoader
我已经尝试过的事情:
- 正在更改 sampleData.xml 文件的名称。
- 使用 value="" 表示法。
- 使用class路径:文件名前。
- 在文件名前使用额外的“/”。
sampleData.xml 与我的测试 class 在同一目录中。我想我错过了一些愚蠢的东西。
sampleData.xml:
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<Benutzer userId="1" firstName="peter" lastName="pan" email="peter@bla.de"/>
<Benutzer userId="2" firstName="hans" lastName="wurst" email="e@e.de"/>
</dataset>
BenutzerVerwaltungsIntegrationsTest:
RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = WebDelegatingSmartContextLoader.class, classes = {ExampleApplicationContext.class})
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class,
DbUnitTestExecutionListener.class})
@DatabaseSetup("sampleData.xml")
@WebAppConfiguration
public class BenutzerverwaltungIntegrationTest {
@Resource
private WebApplicationContext webApplicationContext;
private MockMvc mockMvc;
@Before
public void setUp() {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
@Test
@ExpectedDatabase("sampleData.xml")
public void findAll() throws Exception {
mockMvc.perform(get("/verwaltung"))
.andExpect(status().isOk())
.andExpect(forwardedUrl("/WEB-INF/jsp/verwaltung.jsp"))
.andExpect(model().attribute("Benutzer", hasSize(2)))
.andExpect(model().attribute("Benutzer", hasItem(
allOf(
hasProperty("userId", is(1l)),
hasProperty("firstName", is("peter")),
hasProperty("lastName", is("pan")),
hasProperty("email", is("peter@bla.de"))
)
)))
.andExpect(model().attribute("Benutzer", hasItem(
allOf(
hasProperty("userid", is(2l)),
hasProperty("firstName", is("Hans")),
hasProperty("lastName", is("Wurst")),
hasProperty("email", is("e@e.de"))
)
)));
}
}
ExampleApplicationContext:
@Configuration
@PropertySource("classpath:application.properties")
public class ExampleApplicationContext {
@Resource
private Environment environment;
@Bean
public DataSource dataSource(){
JdbcDataSource dataSource = new JdbcDataSource();
dataSource.setURL(environment.getProperty("spring.datasource.url"));
dataSource.setUser(environment.getProperty("spring.datasource.username"));
dataSource.setPassword(environment.getProperty("spring.datasource.password"));
return dataSource;
}
}
使用 Maven 时,您在 src/test
下有 2 个目录,一个用于 java
个文件,一个用于其他任何东西 resources
。如果您将 .java
文件以外的任何其他文件放在 src/test/java
中,这些文件将不会被处理并复制到 target/test-classes
目录,因此在测试 [=22] 时将不可用=].
您需要将 .xml
文件放在 src/test/resources
目录中,以便对其进行处理和复制。
我正在尝试在我的 Spring 引导应用程序中编写集成测试。我在正确设置设置配置时遇到问题。抛出以下异常:
java.lang.IllegalArgumentException: Unable to load dataset from "sampleData.xml" using class com.github.springtestdbunit.dataset.FlatXmlDataSetLoader
我已经尝试过的事情:
- 正在更改 sampleData.xml 文件的名称。
- 使用 value="" 表示法。
- 使用class路径:文件名前。
- 在文件名前使用额外的“/”。
sampleData.xml 与我的测试 class 在同一目录中。我想我错过了一些愚蠢的东西。
sampleData.xml:
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<Benutzer userId="1" firstName="peter" lastName="pan" email="peter@bla.de"/>
<Benutzer userId="2" firstName="hans" lastName="wurst" email="e@e.de"/>
</dataset>
BenutzerVerwaltungsIntegrationsTest:
RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = WebDelegatingSmartContextLoader.class, classes = {ExampleApplicationContext.class})
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class,
DbUnitTestExecutionListener.class})
@DatabaseSetup("sampleData.xml")
@WebAppConfiguration
public class BenutzerverwaltungIntegrationTest {
@Resource
private WebApplicationContext webApplicationContext;
private MockMvc mockMvc;
@Before
public void setUp() {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
@Test
@ExpectedDatabase("sampleData.xml")
public void findAll() throws Exception {
mockMvc.perform(get("/verwaltung"))
.andExpect(status().isOk())
.andExpect(forwardedUrl("/WEB-INF/jsp/verwaltung.jsp"))
.andExpect(model().attribute("Benutzer", hasSize(2)))
.andExpect(model().attribute("Benutzer", hasItem(
allOf(
hasProperty("userId", is(1l)),
hasProperty("firstName", is("peter")),
hasProperty("lastName", is("pan")),
hasProperty("email", is("peter@bla.de"))
)
)))
.andExpect(model().attribute("Benutzer", hasItem(
allOf(
hasProperty("userid", is(2l)),
hasProperty("firstName", is("Hans")),
hasProperty("lastName", is("Wurst")),
hasProperty("email", is("e@e.de"))
)
)));
}
}
ExampleApplicationContext:
@Configuration
@PropertySource("classpath:application.properties")
public class ExampleApplicationContext {
@Resource
private Environment environment;
@Bean
public DataSource dataSource(){
JdbcDataSource dataSource = new JdbcDataSource();
dataSource.setURL(environment.getProperty("spring.datasource.url"));
dataSource.setUser(environment.getProperty("spring.datasource.username"));
dataSource.setPassword(environment.getProperty("spring.datasource.password"));
return dataSource;
}
}
使用 Maven 时,您在 src/test
下有 2 个目录,一个用于 java
个文件,一个用于其他任何东西 resources
。如果您将 .java
文件以外的任何其他文件放在 src/test/java
中,这些文件将不会被处理并复制到 target/test-classes
目录,因此在测试 [=22] 时将不可用=].
您需要将 .xml
文件放在 src/test/resources
目录中,以便对其进行处理和复制。