2013-05-15 89 views
3

是否有在java中的任何方式來檢查,如果某個方法被調用內的另一個方法是什麼?我正在測試一個課程以及播放聲音時遇到的問題,並且幾乎沒有辦法在不更改代碼的情況下播放播放的音頻文件(內部類中的專用屬性)。然而,該方法播放聲音的方式是它調用播放單個聲音的方法(playSadMusic,playHappyMusic等)。這些方法在我必須創建一個模擬對象的接口中。我有點卡在我如何精確地去測試這個。有什麼想法嗎?歡迎任何關於如何測試這個其他的想法,而不是檢查某個方法是否是電話。檢查的方法被調用內部的另一種方法

我使用JMock的2.6.0和JUnit 4

音頻inteface

public interface StockTickerAudioInterface { 

    public abstract void playHappyMusic(); 

    public abstract void playSadMusic(); 

    public abstract void playErrorMusic(); 
} 

我有花葯接口創建

public interface StockQuoteGeneratorInterface { 
    public abstract StockQuoteInterface getCurrentQuote() throws Exception; 

    public abstract String getSymbol(); 

    public abstract void setSymbol(String symbol); 

    public abstract StockQuoteGeneratorInterface createNewInstance(String symbol); 

} 

類的一個模擬被測試

public class StockQuoteAnalyzer { 
    private StockTickerAudioInterface audioPlayer = null; 
    private String symbol; 
    private StockQuoteGeneratorInterface stockQuoteSource = null; 

    private StockQuoteInterface lastQuote = null; 
    private StockQuoteInterface currentQuote = null; 


    public StockQuoteAnalyzer(String symbol, 
     StockQuoteGeneratorInterface stockQuoteSource, 
     StockTickerAudioInterface audioPlayer) 
     throws InvalidStockSymbolException, NullPointerException, 
     StockTickerConnectionError { 
     super(); 

    // Check the validity of the symbol. 
     if (StockTickerListing.getSingleton().isValidTickerSymbol(symbol) == true){ 
      this.symbol = symbol; 
     } else { 
     throw new InvalidStockSymbolException("Symbol " + symbol 
       + "not found."); 
     } 
     if (stockQuoteSource == null) { 
      throw new NullPointerException(
       "The source for stock quotes can not be null"); 
     } 
     this.stockQuoteSource = stockQuoteSource; 
     this.audioPlayer = audioPlayer; 
    } 
    public double getChangeSinceLast() { 
     double retVal = 0.0; 
     if (this.lastQuote != null) { 
      double delta = this.currentQuote.getLastTrade() - this.lastQuote.getLastTrade(); 
      retVal = 100 * (delta/this.lastQuote.getLastTrade()); 
      } 
      return retVal; 
    } 

    public double getChangeSinceYesterday() { 
     double delta = (this.currentQuote.getLastTrade() - this.currentQuote 
      .getClose()); 
     return 100 * (delta/this.currentQuote.getClose()); 

    } 

    public void playAppropriateAudio() { 
     if ((this.getChangeSinceYesterday() > 2) 
      || (this.getChangeSinceLast() > 0.5)) { 
      audioPlayer.playHappyMusic(); 
    } 

     if ((this.getChangeSinceYesterday() < -2) 
      || (this.getChangeSinceLast() < -0.5)) { 
      audioPlayer.playSadMusic(); 
     } 
    } 

} 
+0

我的水晶球體說「是」哦,請提供一些代碼並說明您到目前爲止嘗試過的方法 –

+1

您可以檢查堆棧跟蹤。 – assylias

+1

按照John Snow。 Mockito是答案。您可以創建一個方法被調用的次數。 – Rudy

回答

2

說你有一個方法child()被稱爲在parent()

public void parent() { 
    child(); 
} 

child()得到它得到了來自調用的最後一個方法,你可以使用StackTraceElement

public void child() { 
    StackTraceElement[] traces = Thread.currentThread().getStackTrace(); 
    boolean check = false; 
     for(StackTraceElement element : traces) { 
     if(check) { 
      System.out.println("Calling method - " + element.getMethodName()); 
     } 
     if(element.getMethodName().equals("child")) { 
     check = true; 
     } 
     } 
} 
-1

提供你在同一個線程調用方法,您可以在任何給定的時刻以這種方式檢查堆棧跟蹤:

Thread.currentThread().getStackTrace() 

您可以看到遇到了什麼HOD被稱爲做這樣的:

for (StackTraceElement ste : Thread.currentThread().getStackTrace()) { 
      System.out.println(ste); 
     } 

例如:

public class Test { 

    public static void main (String[]s){ 
     Test test = new Test(); 
     test.makeTest(); 
    } 

    public void makeTest(){ 
     for (StackTraceElement ste : Thread.currentThread().getStackTrace()) { 
      System.out.println(ste); 
     } 
    } 

結果

java.lang.Thread.getStackTrace(Unknown Source) 
Test.makeTest(Test.java:17) 
Test.main(Test.java:11) 
0

如果你正在編寫一個模擬對象與要檢查是否方法,他們被稱爲,可以實現在他們提出,他們被稱爲當一些標誌的方式方法,例如

public void playHappyMusic() { 
    this.wasCalled = true; 
} 

wasCalled是一個公共的(或與吸氣劑)類變量。然後你只是檢查國旗。

7

如果使用Mockito你可以使用verify()檢查的時間一致的方法被稱爲數。使用這樣的:

verify(mockedObject, times(1)).methodToValidate(); 

您可以檢查是否methodToValidate()被稱爲具有特定字符串,E.I verify(mockedObject, times(1)).methodToValidate("a specific value"); verify(mockedObject, times(1)).methodToValidate(anyString());:或者你可以用anyString()像這樣使用它。

除非這個方法被調用你指定的paramterer,會導致測試失敗

瞭解更多關於驗證here

UPDATE

由於您使用JMock的您的後期編輯狀態,快速googeling給我看,這是有可能實現與JMock的一個類似的行爲和它的expect方法。它如下使用:通過閱讀jMocks getting started page

mockedObject.expects(once()).method("nameOfMethod").with(eq("An optional paramter")); 

更詳細的解釋可以發現。

相關問題