2016-01-26 2 views
1

Я пытаюсь выполнить интеграционный тест с использованием Spring Framework. До сих пор у меня есть код, но я не понимаю, как исправить исключение.Тест интеграции с SpringFramework Java

Это контроллер, который я хочу интегрировать.

@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; 
    } 
} 

Для теста я использую блок дб и я пытаюсь сделать базу данных в оперативной памяти. 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="[email protected]" username="qwerty" 
      hostname="something.com" pass="password1234" /> 

     <Person id="2" email="[email protected]" 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) 

ОБНОВЛЕНИЕ После того, как я исправить л ogin.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) 
+2

Вы пытались добавить префикс classpath: login.xml – hasnae

+0

@hasnae я пробовал, но это не сработало. – RockOrDead

+0

Ваше новое обновление - совершенно другой вопрос. Возьмите еще один вопрос, пожалуйста. –

ответ

0

в соответствии с исходным кодом, вы получаете это исключение, потому что набор данных null. Я думаю, что интеграционный тест не может найти файл /login.xml и жалуется на это.

Попробуйте указать абсолютный путь login.xml, чтобы узнать, существует ли проблема в поиске набора данных.

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

Я попытался, но он снова не сработал с тем же исключением – RockOrDead

0

Посмотрите в документе: https://springtestdbunit.github.io/spring-test-dbunit/

Как вы объявили

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

Вы должны поставить XML в корне, например, в стандартной раскладкой Maven, test/resources. (Или другое подходящее место, так что он может быть расположен как ресурс с пути /login.xml)


Следующее обновление что-то не имеет значения.

Блок DB просто не может найти таблицу Person, чтобы сделать вставку. Это то, о чем мы никогда не узнаем. Проверьте свою БД и убедитесь, что у DB, к которому подключены ваши тесты, требуется таблица

+0

Я видел, что login.xml не был там, где он должен быть. Теперь у меня есть новое исключение. Я добавлю его к вопросу. – RockOrDead

+0

Напоминание: если оно не связано с исходным вопросом, пожалуйста, поднимите новый вопрос. –

+0

Я добавлю новый вопрос. – RockOrDead