2016-04-04 5 views
1

Я пытаюсь запустить этот тест JUnit, но я получаю NPE:NPE в источнике данных

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.SQLException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.annotation.Resource; 
import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 
import javax.sql.DataSource; 
import org.junit.After; 
import org.junit.AfterClass; 
import org.junit.Before; 
import org.junit.BeforeClass; 
import org.junit.Test; 

public class KnowledgebaseTest 
{ 

    public KnowledgebaseTest() 
    { 
    } 

    @BeforeClass 
    public static void setUpClass() throws Exception 
    { 
     try 
     { 
      // Create initial context 
      System.setProperty(Context.INITIAL_CONTEXT_FACTORY, 
       "org.apache.naming.java.javaURLContextFactory"); 
      System.setProperty(Context.URL_PKG_PREFIXES, 
       "org.apache.naming"); 
      InitialContext ic = new InitialContext(); 

      ic.createSubcontext("java:"); 
      ic.createSubcontext("java:/comp"); 
      ic.createSubcontext("java:/comp/env"); 
      ic.createSubcontext("java:/comp/env/jdbc"); 

      String host = "localhost"; 
      int port = 5432; 
      String dbName = "crm"; 
      String username = "postgres"; 
      String password = "qwerty"; 

      Class.forName("org.postgresql.Driver"); 
      Connection conn = null; 
      conn = DriverManager.getConnection("jdbc:postgresql://" + host + ":" + port + "/" + dbName, username, password); 
      conn.close(); 

      ic.bind("java:/comp/env/jdbc/nameofmyjdbcresource", conn); 

     } 
     catch (NamingException ex) 
     { 
      Logger.getLogger(KnowledgebaseTest.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 

    @AfterClass 
    public static void tearDownClass() 
    { 
    } 

    @Before 
    public void setUp() 
    { 
    } 

    @After 
    public void tearDown() 
    { 
    } 

    @Resource(name = "java:/comp/env/jdbc/nameofmyjdbcresource") 
    DataSource ds; 

    @Test 
    public void testPageFirst() throws SQLException 
    { 
     if (ds == null) 
     { 
      throw new SQLException("Can't get data source"); 
     } 
     Connection conn = ds.getConnection(); 

     if (conn == null) 
     { 
      throw new SQLException("Can't get database connection"); 
     } 

     PreparedStatement ps = null; 
     boolean committed = false; 
     try 
     { 
      conn.setAutoCommit(false); 
      ps = conn.prepareStatement("UPDATE ACCOUNT SET LAST_LOGIN = CURRENT_DATE WHERE USER_NAME = ?"); 

      ps.setString(1, "TIMESTAMP"); 
      ps.executeUpdate(); 
      ps.close(); 

      conn.commit(); 
      committed = true; 
     } 
     finally 
     { 
      if (!committed) 
      { 
       conn.rollback(); 
      } 

      if (ps != null) 
      { 
       ps.close(); 
      } 
      conn.close(); 
     } 
    } 
} 

По некоторым причинам йз равна нулю. Каков правильный способ инициализации объекта источника данных в тестовом файле JUnit?

java.sql.SQLException: Can't get data source 

Можете ли вы предложить какое-то решение для решения этой проблемы или лучшего решения?

+0

Можете ли вы убедиться, что ваш сервер базы данных запущен и работает. – LearningPhase

+0

Да, я могу соединиться с инструментами разработки –

ответ

2

Ваш код не кажется правильным, вы должны связывать источник данных, а не соединение. Чтобы исправить код (при условии, что вы используете PGSQL), вам нужно будет связать источник данных, как показано ниже:

 import org.postgresql.jdbc2.optional.SimpleDataSource; 
     ... 
     SimpleDataSource dataSource = new SimpleDataSource(); 
     dataSource.setDatabaseName(dbName); 
     dataSource.setPortNumber(port); 
     dataSource.setUser(username); 
     dataSource.setPassword(password); 


     ic.bind("java:/comp/env/jdbc/nameofmyjdbcresource", dataSource); 

Затем вы можете установить переменную из метода нАлАдкИ в следующем:

DataSource ds; 

@Before 
public void setUp() throws NamingException { 
    this.ds = (DataSource) new InitialContext().lookup("java:/comp/env/jdbc/nameofmyjdbcresource"); 
} 

Во всяком случае , в JUnit нет магии по умолчанию, которая могла бы позволить вам вводить источник данных, поэтому @Resource(name = "java:/comp/env/jdbc/nameofmyjdbcresource") будет проигнорирован по умолчанию JUnit, если вы хотите провести реальный интеграционный тест с вашим любимым JEE-сервером с использованием зависимости/ресурса, вы можете получить посмотреть на arquillian

+0

Можете ли вы предложить какое-то решение, как можно исправить код? –

+0

@PeterPenzov Я обновил свой пост, прыгая, что он поможет исправить ваш тест –

Смежные вопросы