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