当我运行测试类时,它抛出了这个错误:
Testcase: testAddSpecialty(web.models.tblSpecialty.SpecialtyDAOTest): Caused an ERROR
Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:350)
at javax.naming.InitialContext.lookup(InitialContext.java:417)
at web.utils.DBHelpers.makeConnection(DBHelpers.java:25)
at web.models.tblSpecialty.SpecialtyDAO.addSpecialty(SpecialtyDAO.java:143)
at web.models.tblSpecialty.SpecialtyDAOTest.testAddSpecialty(SpecialtyDAOTest.java:39)
这是我的测试课
package web.models.tblSpecialty;
import org.junit.Test;
import static org.junit.Assert.*;
public class SpecialtyDAOTest {
SpecialtyDAO dao = new SpecialtyDAO();
public SpecialtyDAOTest() {
}
@Test
public void testAddSpecialty() throws Exception {
String name = "dentistry";
assertTrue(dao.addSpecialty(name));
}
这是我的SpecialtyDAO类,用于从数据库中获取数据
public boolean addSpecialty(String specialtyName) throws SQLException, NamingException {
Connection con = null;
PreparedStatement stm = null;
try {
con = DBHelpers.makeConnection();
if (con != null) {
String sql = "INSERT INTO tblSpecialty "
+ "(SpecialtyName) values(?)";
stm = con.prepareStatement(sql);
stm.setString(1, specialtyName);
int row = stm.executeUpdate();
if (row > 0) {
return true;
}
}
} finally {
if (stm != null) {
stm.close();
}
if (con != null) {
con.close();
}
}
return false;
}
我的项目在Tomcat服务器上运行良好,所以我认为这不是数据库连接错误。谁能帮我解决这个问题? 非常感谢
实际上你几乎自己给出了答案。
当您在 NetBeans 中执行测试时,您将在 tomcat(这是一个 servlet 容器)之外运行它。
但是您尝试测试的代码依赖于这样的 servlet 容器,因为它通过javax.naming
akaJNDI
检索数据库连接。这只是 servlet 容器提供给运行在其中的应用程序的组件的一部分。
因此,如果在 NetBeans 中运行测试,则整个环境不可用,因此测试无法通过JNDI
查找数据库连接。
为了修复您的测试,您可以:
- 模拟
DBHelpers.makeConnection()
调用以返回您选择的数据库连接。 - 手动初始化
JNDI
或使用某种框架(如 Simple-JNDI)。 - 在 servlet 容器中运行测试。