2017-09-04 36 views
0

首先是 - 這裏是我的代碼的一部分:爪哇 - 在if語句調用布爾超時功能,因此不會發送電子郵件

public void run() { 



      try { 

      _conn = new SmtpConnection(this, _socket); 
      _state = new SmtpState(_workspace); 
      _quitting = false; 


      sendGreetings(); 


       while (!_quitting) 
       handleCommand(); 

     } catch (SocketTimeoutException ste) { 
      _conn.send("421 Service shutting down and closing transmission channel"); 

     } catch (Exception e) { 
      // Closing socket on blocked read 


      if (!_quitting) { 
       log.error("Unexpected error handling connection, quitting=", e); 
       throw new IllegalStateException(e); 
      } 
     } finally { 
      if (null != _state) { 
       _state.clearMessage(); 
      } 
     } 

    } 

,我有一個同樣功能的另一個類,被稱爲timeoutonemail

public boolean timeoutOnNextEmail() 
{ 

    boolean timeout = true; 
    return timeout; 
} 

我有一個單元測試,應該儘量發送E-mail,但是當我打電話timeoutfuntion,測試應該通過 - 因此它不應該發送一封電子郵件

/* @Test(expected = MailException.class) 
public void sendEmailFail() throws MailException { 

    greenMail.timeoutOnNextEmail(); 

    try { 
     app.sendMail("to", "from", "subject", "body"); 
    } catch (final MailException e) { 
     throw new MailException(e.toString()); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

    assertEquals(0, greenMail.getReceivedMessagesForDomain("to").length); 
}*/ 

我怎樣才能知道我跑funtion,如果我打電話在我的單元測試timeoutfuntion,所以它應該停止這樣做,讓我的線程休眠..我想是這樣

*/*     if(timeout && !_quitting){ 
       greenMail.timeoutOnNextEmail(); 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
      else 
      { 
       handleCommand(); 
      }*/* 

和幾個不同選項,但我只是不知道如何正確調用它..

+0

*以便它應該停止這樣做,讓我的線程睡覺*你想停止什麼(什麼是'那')? – nullpointer

+0

你的產品代碼應該從不**知道你在單元測試中做的事情。 –

+0

即時通訊開發的框架,所以它必須有該選項..這就是爲什麼我這樣做.. - 這是我的smtp服務器,它應該超時 - 以便下一封電子郵件不能發送 – minzbuddy

回答

0

首先,你只能有你想要的行爲,如果你有線程。

你可以有一個消息隊列發送。一個線程將消息放入隊列中,其他線程將從隊列中獲取消息。是一個producer/consumer的經典問題。

可能有另一個代理從隊列中消除消息,或者更簡單地說,消費者可以檢查另一個數據結構以知道是否丟棄或處理消息。

現在,在您的單元測試中,您可以用一個模擬睡眠一段固定的時間來替換消費者,讓時間讓中斷代理採取行動。