检查是否在另一个方法中调用了一个方法

时间:2013-05-15 07:17:34

标签: java junit jmock

在java中有没有办法检查某个方法是否在另一个方法中被调用?我正在测试一个类和我遇到播放声音问题的方法,实际上没有办法获取播放的音频文件(内部类中的私有属性)而不更改代码。然而,该方法播放声音的方式是调用播放单个声音的方法(playSadMusic,playHappyMusic等)。这些方法在我必须为其创建模拟对象的接口中。我有点坚持我将如何进行测试。有什么想法吗?除了检查某种方法是否被呼叫之外,还有其他任何关于我如何测试这个的想法是值得欢迎的。

我正在使用JMock 2.6.0和JUnit 4

音频接口

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();
        }
    }

}

4 个答案:

答案 0 :(得分:7)

如果您使用Mockito,则可以使用verify()来检查调用方法的次数。像这样使用它:

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

您可以检查是否使用特定字符串调用methodToValidate(),e。verify(mockedObject, times(1)).methodToValidate("a specific value");或者您可以将其与anyString()一起使用,如下所示:verify(mockedObject, times(1)).methodToValidate(anyString());

除非使用指定的参数调用此方法,否则测试将失败

详细了解验证here

更新

由于您编辑的帖子表明您正在使用jMock,因此快速googeling向我展示了使用jMock和expect方法可以实现类似的行为。它的用法如下:

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

通过阅读jMocks getting started page可以找到更详细的解释。

答案 1 :(得分: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;
         }
      }
}

答案 2 :(得分:0)

如果您正在使用要检查它们是否被调用的方法编写模拟对象,则可以通过在调用它们时引发某些标志的方式来实现这些方法,例如

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

wasCalled是一个公共(或带有getter)类变量。然后你只需检查旗帜。

答案 3 :(得分:-1)

假设您与调用方法位于同一个线程中,您可以通过这种方式检查堆栈跟踪:

Thread.currentThread().getStackTrace()

你可以看到这样做的方法:

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)