2016-06-16 2 views
-1

я нашел очень хороший пример для сервера SNMP и SNMP клиента, но я не знаю, как я могу осуществить тест JUnit в один тестовый файл:Реализовать тест JUnit для сервера SNMP и клиента

public class SNMPClientTest 
{ 
    @Test 
    public void randomData() 
    { 
     SnmpTrap trap = new SnmpTrap("127.0.0.1", 
      "1.3.6.1.4.1.2789.2005.1={s}WWW Server Has Been Restarted", 
      2, "kschmidt", "MD5", "mysecretpass", "DES", "mypassphrase"); 
     trap.doTrap(); 
    } 
} 


public class SNMPServerTest 
{ 
    @Test 
    public void randomDatabaseData() throws SQLException, FileNotFoundException, IOException 
    { 
     V3TrapReceiver v3 = new V3TrapReceiver("127.0.0.1", "kschmidt", "MD5", 
      "mysecretpass", "DES", "mypassphrase"); 
     v3.listen(); 
    } 
} 

Когда я бегу сервер Я получаю сообщение Waiting for traps.., и я не могу продолжить тест JUnit. Но я могу запустить их в 2 отдельных файла.

Как я могу это решить? Вы можете найти полный исходный код здесь: http://pastebin.com/zKEtXQmq

ответ

0

Запустите сервер в методе, аннотированном @BeforeClass. Это будет выполняться до вызова других тестов.

+0

Я согласен, но выполнение кода висит, потому что есть метод сна(). Как я могу разработать код - это способ запустить их обоих? –

+0

метод сна? не могу найти ... Я думал, что 'v3.listen();' порождает поток (неблокирующий), который будет запускаться из «сеанса тестирования junit», и, таким образом, клиент может отправить материал на этот сервер – oberbics

+0

Да, как я могу это решить? –

1

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

Обычно я стараюсь избегать этого, потому что он добавляет некоторую сложность и управление контекстом к тесту.

Обратите внимание:

  • Этот образец не был проверен, может быть твики, которые должны быть сделаны. Суть обработки дополнительных нитей должна быть примерно одинаковой.
  • Я ничего не проверял для ваших тестов, поэтому все это означает, что сервер запускается, а затем клиент, не ожидая выхода или состояния.

    @Rule 
    public ErrorCollector collector = new ErrorCollector(); 
    @Rule 
    public Timeout testTimeout = new Timeout(15, TimeUnit.SECONDS); 
    @Test 
    public void testServerClientCommunication throws Exception() { 
        final SnmpTrap trap = new SnmpTrap("127.0.0.1", 
          "1.3.6.1.4.1.2789.2005.1={s}WWW Server Has Been Restarted", 
          2, "kschmidt", "MD5", "mysecretpass", "DES", "mypassphrase"); 
    
        final V3TrapReceiver v3 = new V3TrapReceiver("127.0.0.1", "kschmidt", "MD5", 
          "mysecretpass", "DES", "mypassphrase"); 
    
        Runnable serverTask = new Runnable() { 
    
         @Override 
         public void run() { 
          try { 
           while (!Thread.currentThread().isInterrupted()) { 
            v3.listen(); 
           } 
          } catch (Throwable th) { 
           //Exceptions thrown outside of the main Junit execution won't get propagated back to fail the test 
           //Use the ErrorCollector to maintain awareness 
           collector.addError(th); 
          } 
         }}; 
         //Create the Thread to handle the Server execution 
         final Thread serverExecutor = new Thread(serverTask, "SNMP Server"); 
        /* 
        * Create the client task and thread. 
        */ 
        Runnable clientTask = new Runnable() { 
    
         @Override 
         public void run() { 
          try { 
           boolean clientIsDone = false; 
           while (!clientIsDone) { 
            trap.doTrap(); 
            //FIXME: Determine the state that matters. 
            clientIsDone = true; 
           } 
    
          } catch (Throwable th) { 
           //Exceptions thrown outside of the main Junit execution won't get propagated back to fail the test 
           //Use the ErrorCollector to maintain awareness 
           collector.addError(th); 
          } 
         }}; 
    
    
         Thread clientExecutor = new Thread(clientTask, "SNMP Client"); 
    
         /* 
         * Start the server first 
         */ 
         //Don't hold the JVM if the server is not done. 
         serverExecutor.setDaemon(true); 
         serverExecutor.start(); 
    
          /* 
          * Now start the client. Note that after the client traps successfully that it will interrupt the server thread. 
          * The intent is that the interrupt will allow the server thread to die gracefully 
          */ 
         clientExecutor.setDaemon(true); 
         clientExecutor.start(); 
    
         //Since we off-threaded the tasks the test will consider itself 'done' unless we join with the client, which basically says 
         //"Hold the current thread at this point until the other thread completes." 
         clientExecutor.join(); 
    } 
    
+0

Я получаю 'Прерывание во время ожидания ловушек: java.lang.InterruptedException' –

+0

Если вы ** не ** получили состояние, которое ожидали, вам может понадобиться создать контекстно-зависимый цикл вокруг trap.doTrap (), пока не будет достигнуто ожидаемое состояние. Отбросьте блок «finally» с clientTask. Вызов прерывания был любезностью для «наилучшего пути» для обработки двух потоков, но он не играет хорошо с errorCollector (я пропустил это - извините). Пока serverExecutor установлен как демон, это не должно иметь никакого влияния. – Jeremiah

+0

Можете ли вы, пожалуйста, обновить свой ответ, пожалуйста. –

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