как использовать и тестировать ждать и уведомлять - PullRequest
1 голос
/ 31 января 2012

Я новичок в использовании ждать и уведомлять. У меня проблемы с тестированием моего кода. Ниже моя реализация: (ПРИМЕЧАНИЕ: я не включил всю реализацию)

public class PoolImp {
  private Vector<Connection> connections; // For now maximum of 1 connection


  public synchronized Connection getconnection() {
       if(connections.size == 1() ) {
         this.wait();
     }
      return newConnection(); // also add to connections
  }

 public synchronized void removeconnection() {
       connections.size = 0;
       this.notify();
  }

}

Ниже приведен мой метод тестирования: conn_1 получает первое соединение. conn_2 переходит в режим ожидания, поскольку разрешено только максимум 1 соединение

Я хочу проверить это таким образом, чтобы при вызове removeconnection conn_2 получал уведомление и получал освобожденное соединение.

Тестирование: @ Test

 public void testGetConnections() throws SQLException
{  
  PoolImpl cp = new PoolImpl();
  Connection conn_1 = null;
  Connection conn_2 = null;
  conn_1 = cp.getConnection();
  conn_2 = cp.getConnection();
  cp.removeConnection(conn_1);}
}   

Ответы [ 3 ]

2 голосов
/ 31 января 2012

Чтобы протестировать ожидание и уведомления, вам нужно несколько потоков. В противном случае ожидающий поток заблокируется и никогда не доберется до уведомляющего кода, поскольку он находится в том же потоке.

P.S. Внедрение пулов соединений - непростая задача. Я бы даже не стал беспокоиться, так как можно использовать готовые .

0 голосов
/ 31 января 2012

Замена блока if на цикл while является улучшением, но не решит реальную проблему здесь.Он просто принудительно выполнит еще одну проверку размера коллекции после того, как было отправлено уведомление, чтобы убедиться в достоверности заявки, выданной при выдаче уведомления ().

Как указывалось ранее, вам нужно несколько клиентских потоков длясмоделируйте это.Ваш тестовый поток блокируется, когда вы вызываете conn_2 = cp.getConnection ();

Теперь у него никогда не будет возможности выполнить этот вызов, поскольку он будет ждать бесконечно (если он не прерван) cp.removeConnection (conn_1);

0 голосов
/ 31 января 2012

Все правильно, вы должны взять готовый класс для вашего пула соединений.Но если вы настаиваете, я исправил код для вас:

public class PoolImp {
  private Vector<Connection> connections; // For now maximum of 1 connection


  public synchronized Connection getconnection() {
       while(connections.isEmpty()) {
         this.wait();
     }
     return newConnection(); 
  }

 public synchronized void removeconnection(Connection c) {
       connections.add(c);
       this.notify();
  }

}

...