2012-02-27 46 views
0

我试图为使用jdbc资源的文件创建一个测试。除了当我试图测试使用实体管理器的东西时,定期测试在整个项目中都能正常工作。我想我错过了一些简单的东西,并希望得到任何帮助。在Netbeans中使用Maven项目使用jUnit测试检查JDBC查找时出错

这是错误。

Feb 27, 2012 3:04:44 PM com.sun.enterprise.v3.server.ApplicationLifecycle deploy 
SEVERE: javax.naming.NamingException: Lookup failed for 'jdbc/foundation' in SerialContext[myEnv={com.sun.enterprise.connectors.jndisuffix=__pm, java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: foundation not found] 
java.lang.RuntimeException: javax.naming.NamingException: Lookup failed for 'jdbc/foundation' in SerialContext[myEnv={com.sun.enterprise.connectors.jndisuffix=__pm, java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: foundation not found] 

下面是一些我所采取的故障排除步骤:

  • 添加了GlassFish群众演员Maven的POM
  • 我已经把持久性文件中都/主/资源/测试/资源文件夹。
  • 我已经尝试在DonationsFacadeTest文件的@BeforeClass方法中的上下文对象中添加属性,以及大约一百万种与下面类似的其他配置。

环境信息:

  • 使用NetBeans 7.0.1
  • Maven项目
  • Glassfish的3.1

DonationsFacade.java - 这个类使用一个门面模式,以提供间接访问JPA实体。

@Stateless 
public class DonationsFacade extends AbstractFacade<Donations> { 
@PersistenceContext(unitName = "FoundationPU") 
private EntityManager em; 

protected EntityManager getEntityManager() { 
    return em; 
} 

public DonationsFacade() { 
    super(Donations.class); 
} 

public boolean setPaid(int id, String transId) 
{ 
    try{ 
     Donations don = em.find(Donations.class, id); 
     don.setStatus("Paid"); 
     don.setConfirmationnumber(transId); 
     em.persist(don); 
     em.flush(); 
     return true; 
    } 
    catch(Exception ex) 
    { 
     return false; 
    } 
} 

测试文件 - 试图写一个简单的测试来验证数据。

public class DonationsFacadeTest { 

@Test 
public void testSetPaid() throws Exception { 
    int id = 1; 
    String transId = "123"; 
    EJBContainer ejbC = EJBContainer.createEJBContainer(); 
    Context ctx = ejbC.getContext();  
    DonationsFacade instance = (DonationsFacade)ctx.lookup("java:global/classes/DonationsFacade"); 
    boolean expResult = false; 
    boolean result = instance.setPaid(id, transId); 
    assertEquals(expResult, result); 
    ejbC.close(); 
} 
} 

的persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"...> 
    <persistence-unit name="FoundationPU" transaction-type="JTA"> 
    <jta-data-source>jdbc/foundation</jta-data-source> 
    <properties/> 
    </persistence-unit> 
</persistence> 

与GlassFish resources.xml中

<resources> 
<jdbc-resource enabled="true" jndi-name="jdbc/foundation" object-type="user" pool-name="mysql_foundation_rootPool"> 
<description/> 
</jdbc-resource> 
<jdbc-connection-pool allow-non-component-callers="false" 
       associate-with-thread="false" 
       connection-creation-retry-attempts="0" 
       connection-creation-retry-interval-in-seconds="10" 
       connection-leak-reclaim="false" 
       connection-leak-timeout-in-seconds="0" 
       connection-validation-method="table" 
       datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" 
       fail-all-connections="false" idle-timeout-in-seconds="300" 
       is-connection-validation-required="false" 
       is-isolation-level-guaranteed="true" 
       lazy-connection-association="false" 
       lazy-connection-enlistment="false" 
       match-connections="false" 
       max-connection-usage-count="0" 
       max-pool-size="32" 
       max-wait-time-in-millis="60000" 
       name="connectionPool" 
       non-transactional-connections="false" 
       ping="false" 
       pool-resize-quantity="2" 
       pooling="true" 
       res-type="javax.sql.DataSource" 
       statement-cache-size="0" 
       statement-leak-reclaim="false" 
       statement-leak-timeout-in-seconds="0" 
       statement-timeout-in-seconds="-1" 
       steady-pool-size="8" 
       validate-atmost-once-period-in-seconds="0" 
       wrap-jdbc-objects="true"> 
<property name="URL" value="jdbc:mysql://localhost:3306/foundation"/> 
<property name="User" value="root"/> 
<property name="Password" value="thepassword"/> 
</jdbc-connection-pool> 
</resources> 

再次感谢您的帮助,非常感谢。

+0

Glassfish是否在执行测试时运行?什么是JNDI提供者? – duffymo 2012-02-27 23:33:06

+0

是的,glassfish正在运行。我认为这只是典型的MySQL jdbc提供程序。 – JCab 2012-02-27 23:36:59

+0

不,JNDI命名服务是Glassfish的一部分。你如何告诉一个没有运行Glassfish的应用程序,比如你的单元测试,使用Glassfish JNDI命名服务? – duffymo 2012-02-27 23:41:38

回答

0

这里找出答案。我基本上把一个实体管理员注入了课堂。希望这对试图做同样事情的人有帮助。

public class DonationsFacadeTest { 


private EntityManager em; 
private EntityTransaction tx; 
DonationsFacade donations; 

public DonationsFacadeTest() { 
} 

@Before 
public void setUpClass() throws Exception { 

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("Foundation2"); 
    em = emf.createEntityManager(); 
    tx = em.getTransaction(); 
    this.donations = new DonationsFacade(); 
    this.donations.em = em; 
} 

/** 
* Test of setPaid method, of class DonationsFacade. 
*/ 
@Test 
public void testSetPaid() throws Exception { 

    int id = 1; 
    String transId = "123"; 

    boolean expResult = false; 
    boolean result = donations.setPaid(id, transId); 
    assertEquals(expResult, result); 

} 
} 

相应地修改了persistence.xml文件。

<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" ... > 
<persistence-unit name="Foundation2" transaction-type="RESOURCE_LOCAL"> 
    <class>org.scmc.foundation.session.DonationsFacadeTest</class> 
    <exclude-unlisted-classes>true</exclude-unlisted-classes> 
    <properties> 
     <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> 
     <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/foundation"/> 
     <property name="javax.persistence.jdbc.user" value="root"/> 
     <property name="javax.persistence.jdbc.password" value="password"/> 
    </properties> 
</persistence-unit> 

最后加入适当的驱动程序的POM文件。

<dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.18</version> 
    </dependency>