我正在尝试使用Spring Framework进行集成测试。直到现在我有一些代码,但我不明白如何修复异常。
这是我想进行集成测试的控制器。
@Controller
@RequestMapping("/login")
public class LoginController {
@RequestMapping(method = RequestMethod.GET)
public String showForm(Model model, HttpServletRequest request) {
LoginModel form = new LoginModel();
HttpSession session = request.getSession(false);
if (session != null) {
session.invalidate();
}
// destination page in profiles
if (request.getParameter("dest") != null && !request.getParameter("dest").trim().equals("")) {
try {
form.setDestPage(msa.getMessage("configure.path." + request.getParameter("dest").trim()));
} catch (NoSuchMessageException ig) {
logger.error(ig.getMessage());
form.setDestPage(msa.getMessage("configure.path.home"));
}
} else {
form.setDestPage(msa.getMessage("configure.path.home"));
}
// return path
if (request.getParameter("retpath") != null && !request.getParameter("retpath").trim().equals("")) {
String retpath = request.getParameter("retpath").trim();
if (!(retpath.matches("^http[s]?://mail[0-9]{2}\\.asd\\.bg.*")
|| retpath.matches("^http[s]?://nm[0-9]?[0-9]?\\.asd\\.bg.*")
|| retpath.matches("^http[s]?://asd.*\\.ni\\.bg.*")|| retpath.matches("^http[s]?://dox\\.asd\\.bg.*")
|| retpath.matches("^http[s]?://asdwfs\\.ni\\.bg.*"))) {
retpath = "";
}
form.setRetPath(retpath);
}
// email address
if (request.getParameter("email") != null && !request.getParameter("email").trim().equals("")) {
form.setEmail(request.getParameter("email").trim());
}
model.addAttribute("form", form);
return formView;
}
}
对于测试,我正在使用db unit,我尝试创建一个内存数据库。 的 LoginControllerTest
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/applicationContext.xml" })
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class, DbUnitTestExecutionListener.class })
@DatabaseSetup(type = DatabaseOperation.CLEAN_INSERT, value="/login.xml")
public class LoginControllerTest {
private MockMvc mockMvc;
@Before
public void setUp() {
mockMvc = MockMvcBuilders.xmlConfigSetup("classpath:applicationContext.xml").build();
}
@Test
@ExpectedDatabase("/login.xml")
public void testShowForm() throws Exception {
mockMvc.perform(get("/login")).andExpect(status().isOk()).andExpect(view().name("/login"))
.andExpect(forwardedUrl("/WebContent/j/login.jsp"))
.andExpect(model().attribute("form", hasProperty("id", nullValue())))
.andExpect(model().attribute("form", hasProperty("email", isEmptyOrNullString())))
.andExpect(model().attribute("form", hasProperty("username", isEmptyOrNullString())))
.andExpect(model().attribute("form", hasProperty("hostname", isEmptyOrNullString())))
.andExpect(model().attribute("form", hasProperty("pass", isEmptyOrNullString())));
}
}
login.xml
<?xml version="1.0" encoding="UTF-8"?>
<dataset>
<Person id="1" email="test@something.com" username="qwerty"
hostname="something.com" pass="password1234" />
<Person id="2" email="test1@something.com" username="qwerty"
hostname="something.com" pass="password1234" />
</dataset>
堆栈跟踪
java.lang.IllegalArgumentException: Unable to load dataset from "/login.xml" using class com.github.springtestdbunit.dataset.FlatXmlDataSetLoader
at org.springframework.util.Assert.notNull(Assert.java:112)
at com.github.springtestdbunit.DbUnitRunner.loadDataset(DbUnitRunner.java:137)
at com.github.springtestdbunit.DbUnitRunner.setupOrTeardown(DbUnitRunner.java:153)
at com.github.springtestdbunit.DbUnitRunner.beforeTestMethod(DbUnitRunner.java:70)
at com.github.springtestdbunit.DbUnitTestExecutionListener.beforeTestMethod(DbUnitTestExecutionListener.java:136)
at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:277)
at org.springframework.test.context.junit4.SpringMethodRoadie.runBefores(SpringMethodRoadie.java:315)
at org.springframework.test.context.junit4.SpringMethodRoadie.runBeforesThenTestThenAfters(SpringMethodRoadie.java:253)
at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:234)
at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:204)
at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:146)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:151)
at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
java.lang.IllegalArgumentException: Unable to load dataset from "/login.xml" using class com.github.springtestdbunit.dataset.FlatXmlDataSetLoader
at org.springframework.util.Assert.notNull(Assert.java:112)
at com.github.springtestdbunit.DbUnitRunner.loadDataset(DbUnitRunner.java:137)
at com.github.springtestdbunit.DbUnitRunner.verifyExpected(DbUnitRunner.java:122)
at com.github.springtestdbunit.DbUnitRunner.afterTestMethod(DbUnitRunner.java:80)
at com.github.springtestdbunit.DbUnitTestExecutionListener.afterTestMethod(DbUnitTestExecutionListener.java:141)
at org.springframework.test.context.TestContextManager.afterTestMethod(TestContextManager.java:340)
at org.springframework.test.context.junit4.SpringMethodRoadie.runAfters(SpringMethodRoadie.java:351)
at org.springframework.test.context.junit4.SpringMethodRoadie.runBeforesThenTestThenAfters(SpringMethodRoadie.java:262)
at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:234)
at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:204)
at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:146)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:151)
at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
更新 在我修复login.xml位置后,这是新的异常。
org.dbunit.dataset.NoSuchTableException: Person
at org.dbunit.database.DatabaseDataSet.getTableMetaData(DatabaseDataSet.java:288)
at org.dbunit.operation.DeleteAllOperation.execute(DeleteAllOperation.java:109)
at org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79)
at com.github.springtestdbunit.DbUnitRunner.setupOrTeardown(DbUnitRunner.java:159)
at com.github.springtestdbunit.DbUnitRunner.beforeTestMethod(DbUnitRunner.java:70)
at com.github.springtestdbunit.DbUnitTestExecutionListener.beforeTestMethod(DbUnitTestExecutionListener.java:136)
at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:277)
at org.springframework.test.context.junit4.SpringMethodRoadie.runBefores(SpringMethodRoadie.java:315)
at org.springframework.test.context.junit4.SpringMethodRoadie.runBeforesThenTestThenAfters(SpringMethodRoadie.java:253)
at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:234)
at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:204)
at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:146)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:151)
at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
junit.framework.ComparisonFailure: table count expected:<[1]> but was:<[0]>
at org.dbunit.assertion.JUnitFailureFactory.createFailure(JUnitFailureFactory.java:39)
at org.dbunit.assertion.DefaultFailureHandler.createFailure(DefaultFailureHandler.java:105)
at org.dbunit.assertion.DbUnitAssert.assertEquals(DbUnitAssert.java:237)
at org.dbunit.assertion.DbUnitAssert.assertEquals(DbUnitAssert.java:205)
at org.dbunit.Assertion.assertEquals(Assertion.java:104)
at com.github.springtestdbunit.assertion.DefaultDatabaseAssertion.assertEquals(DefaultDatabaseAssertion.java:33)
at com.github.springtestdbunit.DbUnitRunner.verifyExpected(DbUnitRunner.java:128)
at com.github.springtestdbunit.DbUnitRunner.afterTestMethod(DbUnitRunner.java:80)
at com.github.springtestdbunit.DbUnitTestExecutionListener.afterTestMethod(DbUnitTestExecutionListener.java:141)
at org.springframework.test.context.TestContextManager.afterTestMethod(TestContextManager.java:340)
at org.springframework.test.context.junit4.SpringMethodRoadie.runAfters(SpringMethodRoadie.java:351)
at org.springframework.test.context.junit4.SpringMethodRoadie.runBeforesThenTestThenAfters(SpringMethodRoadie.java:262)
at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:234)
at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:204)
at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:146)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:151)
at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
答案 0 :(得分:0)
根据源代码,您将获得此异常,因为数据集为null
。我想集成测试无法找到/login.xml
文件并且抱怨这个。
尝试指定login.xml
的绝对路径,以查看问题是否在于查找数据集。
@DatabaseSetup(type = DatabaseOperation.CLEAN_INSERT, value="ABSOLUTE_PATH_HERE/login.xml")
答案 1 :(得分:0)
查看文档:{{3}}
正如你宣布的那样
@DatabaseSetup(type = DatabaseOperation.CLEAN_INSERT, value="/login.xml")
您应该将xml放在根目录中,例如标准maven布局test/resources
。 (或其他适当的位置,以便可以将其定位为具有路径/login.xml
)
您的下一次更新无关紧要。
DB Unit无法找到要插入的Person
表。这是我们永远无法知道的原因。检查您的数据库并确保连接的测试数据库具有所需的表