springframeworkjava集成测试

springframeworkjava集成测试,java,xml,spring,Java,Xml,Spring,我正在尝试使用Spring框架进行集成测试。到目前为止,我有一些代码,但我不知道如何修复异常 org.dbunit.dataset.NoSuchTableException: Person at org.dbunit.database.DatabaseDataSet.getTableMetaData(DatabaseDataSet.java:288) at org.dbunit.operation.DeleteAllOperation.execute(DeleteAllOpera

我正在尝试使用Spring框架进行集成测试。到目前为止,我有一些代码,但我不知道如何修复异常

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)
这是我要进行集成测试的控制器。

@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单元,并尝试创建内存中的数据库。 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>
更新 修复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)
org.dbunit.dataset.NoSuchTableException:个人
位于org.dbunit.database.DatabaseDataSet.getTableMetaData(DatabaseDataSet.java:288)
位于org.dbunit.operation.deleteAllooperation.execute(deleteAllooperation.java:109)
在org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79)
位于com.github.springtestdbunit.DbUnitRunner.setuportardown(DbUnitRunner.java:159)
位于com.github.springtestdbunit.DbUnitRunner.beforeTestMethod(DbUnitRunner.java:70)
在com.github.springtestdbunit.DbUnitTestExecutionListener.beforeTestMethod(DbUnitTestExecutionListener.java:136)上
位于org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:277)
位于org.springframework.test.context.junit4.SpringMethodRoadie.runBefores(SpringMethodRoadie.java:315)
位于org.springframework.test.context.junit4.SpringMethodRoadie.runbeforesthentestthenature(SpringMethodRoadie.java:253)
位于org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:234)
位于org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:204)
位于org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:146)
位于org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:151)
位于org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
位于org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
位于org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
位于org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
位于org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
位于org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
位于org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
junit.framework.ComparisonFailure:应为表计数,但为:
位于org.dbunit.assertion.JUnitFailureFactory.createFailure(JUnitFailureFactory.java:39)
位于org.dbunit.assertion.DefaultFailureHandler.createFailure(DefaultFailureHandler.java:105)
位于org.dbunit.assertion.DbUnitAssert.assertEquals(DbUnitAssert.java:237)
位于org.dbunit.assertion.DbUnitAssert.assertEquals(DbUnitAssert.java:205)
位于org.dbunit.Assertion.assertEquals(Assertion.java:104)
位于com.github.springtestdbunit.assertion.DefaultDatabaseAssertion.assertEquals(DefaultDatabaseAssertion.java:33)
位于com.github.springtestdbunit.DbUnitRunner.verifyExpected(DbUnitRunner.java:128)
位于com.github.springtestdbunit.DbUnitRunner.afterTestMethod(DbUnitRunner.java:80)
在com.github.springtestdbunit.DbUnitTestExecutionListener.afterTestMethod(DbUnitTestExecutionListener.java:141)上
位于org.springframework.test.context.TestContextManager.afterTestMethod(TestContextManager.java:340)
位于org.springframework.test.context.junit4.SpringMethodRoadie.runafter(SpringMethodRoadie.java:351)
位于org.springframework.test.context.junit4.SpringMethodRoadie.runbeforesthentestthenature(SpringMethodRoadie.java:262)
位于org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:234)
位于org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:204)
位于org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:146)
位于org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:151)
位于org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
位于org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
位于org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
位于org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
位于org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
位于org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
位于org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

根据源代码,您将获得此异常,因为数据集为
null
。我猜集成测试找不到
/login.xml
文件,并且对此表示不满

尝试指定
login.xml
的绝对路径,以查看查找数据集时是否存在问题

@DatabaseSetup(type = DatabaseOperation.CLEAN_INSERT, value="ABSOLUTE_PATH_HERE/login.xml")

根据源代码,您得到此异常是因为数据集为
null
。我猜集成测试找不到
@DatabaseSetup(type = DatabaseOperation.CLEAN_INSERT, value="/login.xml")