java - 检查一个方法是否在另一个方法中被调用

标签 java junit jmock

Java 中有什么方法可以检查某个方法是否在另一个方法中被调用?我正在测试一个类,我在播放声音时遇到问题的方法几乎没有办法在不更改代码的情况下获取播放的音频文件(内部类中的私有(private)属性)。然而,该方法播放声音的方式是调用播放单个声音的方法(playSadMusic、playHappyMusic 等)。这些方法位于我必须为其创建模拟对象的接口(interface)中。我对如何进行测试有点困惑。有什么想法吗?除了检查某个方法是否被调用之外,关于如何测试这个的任何其他想法都是受欢迎的。

我正在使用 JMock 2.6.0 和 JUnit 4

音频接口(interface)

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

}

最佳答案

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

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

您可以检查是否使用特定字符串调用了 methodToValidate(),例如 verify(mockedObject, times(1)).methodToValidate("a specific value") ;或者您可以像这样将它与 anyString() 一起使用:verify(mockedObject, times(1)).methodToValidate(anyString());

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

阅读更多关于验证 here 的信息.

更新

由于您编辑过的帖子声明您正在使用 jMock,所以快速谷歌搜索告诉我可以使用 jMock 实现类似的行为,它是 expect 方法。用法如下:

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

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

关于java - 检查一个方法是否在另一个方法中被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16558995/

相关文章:

java - 缓冲和修改输出流

java - 在tomcat中部署一个jar

java - 如何在 toString 方法中创建多个条件

unit-testing - 为什么这个 TestNG 测试没有调用 mock 方法却通过了?

java - 如何模拟 JdbcTemplate.queryForObject() 方法

java - 所有的转义字符是什么?

java - 运行集成测试时嵌入 MongoDB

java - 如何在netbeans中组织不同的java源文件夹(用于测试)?

java - 使用 EasyMock 模拟 Hibernate 的 SessionFactory

java - 将单元测试引入现有项目