Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查是否在另一个方法中调用了一个方法_Java_Junit_Jmock - Fatal编程技术网

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

Java 检查是否在另一个方法中调用了一个方法,java,junit,jmock,Java,Junit,Jmock,java中有没有办法检查某个方法是否在另一个方法中被调用?我正在测试一个类,我在播放声音时遇到了问题,实际上,如果不更改代码,就无法获得播放的音频文件(内部类中的私有属性)。但是,该方法播放声音的方式是调用播放单个声音的方法(playSadMusic、PlayShappyMusic等)。这些方法位于我必须为其创建模拟对象的接口中。我有点纠结于如何测试这个。有什么想法吗?除了检查某个方法是否被调用之外,我还有其他关于如何测试该方法的想法吗 我正在使用JMock2.6.0和JUnit4 音频接口 p

java中有没有办法检查某个方法是否在另一个方法中被调用?我正在测试一个类,我在播放声音时遇到了问题,实际上,如果不更改代码,就无法获得播放的音频文件(内部类中的私有属性)。但是,该方法播放声音的方式是调用播放单个声音的方法(playSadMusic、PlayShappyMusic等)。这些方法位于我必须为其创建模拟对象的接口中。我有点纠结于如何测试这个。有什么想法吗?除了检查某个方法是否被调用之外,我还有其他关于如何测试该方法的想法吗

我正在使用JMock2.6.0和JUnit4

音频接口

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

}
公共类股票报价分析程序{
private StockTickerAudioPlayer=null;
私有字符串符号;
private StockQuoteGeneratorInterface stockQuoteSource=null;
private StockQuoteInterface lastQuote=null;
private StockQuoteInterface currentQuote=null;
公共股票报价分析程序(字符串符号,
StockQuoteGenerator接口stockQuoteSource,
StockTicker(音频播放器接口)
抛出InvalidStockSymbolException、NullPointerException、,
StockTicker连接错误{
超级();
//检查符号的有效性。
if(StockTickerListing.getSingleton().isValidTickerSymbol(symbol)==true){
这个符号=符号;
}否则{
抛出新的InvalidStockSymbolException(“符号”+符号
+“未找到。”);
}
if(stockQuoteSource==null){
抛出新的NullPointerException(
“股票报价的来源不能为空”);
}
this.stockQuoteSource=stockQuoteSource;
this.audioPlayer=audioPlayer;
}
公共双getChangeSinceLast(){
双回程=0.0;
如果(this.lastQuote!=null){
双增量=this.currentQuote.getLastTrade()-this.lastQuote.getLastTrade();
retVal=100*(delta/this.lastQuote.getLastTrade());
}
返回返回;
}
公共双GetChangesSinceDayed(){
双增量=(this.currentQuote.getLastTrade()-this.currentQuote
.getClose());
返回100*(delta/this.currentQuote.getClose());
}
公共音频{
if((this.getChangesinceDayed()>2)
||(此.getChangeSinceLast()>0.5)){
audioPlayer.playHappyMusic();
}
if((this.getChangesinceDayed()<-2)
||(此.getChangeSinceLast()<-0.5)){
音频播放器。播放音乐();
}
}
}

假设您有一个方法
child()
,该方法在
parent()中调用。

child()

public void parent() {
  child();
}
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;
         }
      }
}

如果您与调用方法处于同一线程中,则可以通过以下方式在任何给定时刻检查堆栈跟踪:

Thread.currentThread().getStackTrace()
您可以看到调用的方法是这样做的:

for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
            System.out.println(ste);
        }
verify(mockedObject, times(1)).methodToValidate();
例如:

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)

如果您正在使用要检查是否调用它们的方法编写模拟对象,则可以实现这些方法,例如,在调用这些方法时,它们会发出一些标志

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

被称为
是一个公共(或带有getter)类变量。然后只需检查标志。

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

for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
            System.out.println(ste);
        }
verify(mockedObject, times(1)).methodToValidate();
您可以检查是否使用特定字符串调用了
methodToValidate()
,例如
verify(mockedObject,times(1)).methodToValidate(“特定值”)
;或者可以将其与
anyString()
一起使用,如下所示:
verify(mockedObject,times(1)).methodToValidate(anyString())

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

阅读更多关于验证的信息

更新

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

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

阅读jMocks可以找到更详细的解释。

my crystal sphere说“是”哦,请提供一些代码并说明您迄今为止尝试了什么,您可以检查堆栈跟踪。请跟随John Snow。莫基托就是答案。您可以根据一个方法被调用的次数来创建junit。我使用的是jmock2.6.0和junit 4。这里似乎可以通过jMock实现类似的行为。查看我编辑的帖子