Java Can';对于测试环境中的数据库,不要使用EntityManagerFactory两次
出于测试目的,我想用测试数据填充Java Can';对于测试环境中的数据库,不要使用EntityManagerFactory两次,java,jpa,jakarta-ee,junit,persistence.xml,Java,Jpa,Jakarta Ee,Junit,Persistence.xml,出于测试目的,我想用测试数据填充类别表。这很好用。 但是当我想填充另一个名为products的表时,就会发生错误 这是因为下面一行(我是通过取消注释下面一行发现的): 以下是日志: Tests in error: testAddOrder(controller.OrdersControllerTest): Tests run: 1, Failures: 0, Errors: 1, Skipped: 0 [INFO] ------------------------------------
类别
表。这很好用。
但是当我想填充另一个名为products
的表时,就会发生错误
这是因为下面一行(我是通过取消注释下面一行发现的):
以下是日志:
Tests in error:
testAddOrder(controller.OrdersControllerTest):
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.851s
[INFO] Finished at: Wed Jan 04 21:05:53 CET 2017
[INFO] Final Memory: 8M/155M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.10:test (default-test) on project snel-transport: There are test failures.
[ERROR]
[ERROR] Please refer to C:\Users\yomac_000\Documents\documenten z\werk\cimsolutions\java_ee\snel-transport\back_end\target\surefire-reports for the individual test results.
[ERROR] -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.10:test (default-test) on project snel-transport: There are test failures.
Please refer to C:\Users\yomac_000\Documents\documenten z\werk\cimsolutions\java_ee\snel-transport\back_end\target\surefire-reports for the individual test results.
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:213)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
Caused by: org.apache.maven.plugin.MojoFailureException: There are test failures.
Please refer to C:\Users\yomac_000\Documents\documenten z\werk\cimsolutions\java_ee\snel-transport\back_end\target\surefire-reports for the individual test results.
at org.apache.maven.plugin.surefire.SurefireHelper.reportExecution(SurefireHelper.java:87)
at org.apache.maven.plugin.surefire.SurefirePlugin.writeSummary(SurefirePlugin.java:641)
at org.apache.maven.plugin.surefire.SurefirePlugin.handleSummary(SurefirePlugin.java:615)
at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:137)
at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:98)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
... 19 more
[ERROR]
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
日志没有太多说明,所以我将向您展示代码。
OrdersControllerTest.java:
public class OrdersControllerTest {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("snel-transport");
StatusFacade statusFacade = new StatusFacade();
CustomerFacade customerFacade = new CustomerFacade();
ProductFacade productFacade = new ProductFacade();
OrdersFacade orderFacade = new OrdersFacade();
CategoryFacade categoryFacade = new CategoryFacade();
String orderURL = "http://localhost:9090/snel-transport/api/orders";
Orders foundOrder = new Orders();
@BeforeClass
public static void setUpBeforeClass() throws Exception {}
@AfterClass
public static void tearDownAfterClass() throws Exception {}
@Before
public void setUp() throws Exception {}
@After
public void tearDown() throws Exception {}
public void insertCategories(){
EntityManagerFactory emf = Persistence.createEntityManagerFactory("snel-transport-test");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Query q = em.createNativeQuery("INSERT INTO Category (Name, categoryId) " +
" VALUES(?,?)");
q.setParameter(1, "Games");
q.setParameter(2, 1L);
q.executeUpdate();
tx.commit();
}
public void insertProducts(){
EntityManagerFactory emf = Persistence.createEntityManagerFactory("snel-transport-test");
System.out.println("can't execute the above line of code");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Query q = em.createNativeQuery("INSERT INTO Product(id, code) " +
" VALUES(?,?)");
q.setParameter(1, 1);
q.setParameter(2, "002");
q.executeUpdate();
tx.commit();
}
@Test
public void testAddOrder() {
insertCategories();
insertProducts();
//More code..
}
}
我不想把这篇文章写得太长。因此,以下是指向其他文件的链接,以备您查看:
persistence.xml链接:
Category.java链接:
Product.java链接:
此外,我已经尝试通过.SQL
文件中的SQL脚本,通过persistence.xml
文件填充测试数据库。为此
我遵循了此教程链接:
但不幸的是,这并没有奏效
我还尝试通过
OrdersControllerTest.java
文件中的setUpBeforeClass()
方法填充测试数据库。但是这也没有解决。如果没有导致测试失败的实际异常,这个问题几乎不可能回答。你现在展示的只是控制台输出,说明“东西失败”和代码。您是否对问题的根源进行过任何调查,比如查看输出所引用的文件以了解详细信息,或者只是从IDE运行一个测试以查看发生了什么?@Gimby它在IDE中工作,但如何工作呢!?在此之前,我是通过控制台使用Tomcat embedded和JUnit的。@Gimby啊,当然,我想我已经知道原因了。。在使用Tomcat embedded 7之前。我在IDE上使用了Tomcat8.5。这可能就是原因。它似乎在IDE中工作这一事实使它很困难,但它不一定有什么奇怪的地方。例如,Eclipse的设置与真正的Maven构建不同,因此您会发现差异。您应该仍然能够在生成的surefire报告中找到控制台输出也引用的某种异常。
public class OrdersControllerTest {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("snel-transport");
StatusFacade statusFacade = new StatusFacade();
CustomerFacade customerFacade = new CustomerFacade();
ProductFacade productFacade = new ProductFacade();
OrdersFacade orderFacade = new OrdersFacade();
CategoryFacade categoryFacade = new CategoryFacade();
String orderURL = "http://localhost:9090/snel-transport/api/orders";
Orders foundOrder = new Orders();
@BeforeClass
public static void setUpBeforeClass() throws Exception {}
@AfterClass
public static void tearDownAfterClass() throws Exception {}
@Before
public void setUp() throws Exception {}
@After
public void tearDown() throws Exception {}
public void insertCategories(){
EntityManagerFactory emf = Persistence.createEntityManagerFactory("snel-transport-test");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Query q = em.createNativeQuery("INSERT INTO Category (Name, categoryId) " +
" VALUES(?,?)");
q.setParameter(1, "Games");
q.setParameter(2, 1L);
q.executeUpdate();
tx.commit();
}
public void insertProducts(){
EntityManagerFactory emf = Persistence.createEntityManagerFactory("snel-transport-test");
System.out.println("can't execute the above line of code");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Query q = em.createNativeQuery("INSERT INTO Product(id, code) " +
" VALUES(?,?)");
q.setParameter(1, 1);
q.setParameter(2, "002");
q.executeUpdate();
tx.commit();
}
@Test
public void testAddOrder() {
insertCategories();
insertProducts();
//More code..
}
}