如何对以下代码进行单元测试:
@Override public void update() { if (isStopped() || isPaused()) { return; } // ... }
此方法来自音频流。需要定期调用它,以便流读取新数据。如果播放停止或暂停,则流不应该前进,所以我立即返回。但是,我找不到为此代码编写测试的方法。
答案 0 :(得分:1)
也许返回boolean
表示发生了什么?
答案 1 :(得分:1)
在这种情况下,您应该测试方法调用没有副作用。例如,如果...在协作者上有方法调用,则应该模拟该协作者,然后验证协作者上没有方法被调用。
您可能还可以测试调用更新的对象上的属性不会更改,具体取决于您班级中的实际内容....
答案 2 :(得分:0)
这是一个复杂的方法:
一个想法是实现Observer
模式,定义一个可以订阅测试类中的事件的侦听器接口。在这种情况下,事件将在if块之后发送:
public interface EventListener{
// EventDetails would be an object that encapsulates
// event type and extra data
void process(EventDetails type);
}
private void dispatchEvent(EventType type){
for(EventListener listener : this.listeners){
listener.process(new EventDetails(type
/* you'll want to add more data than that here */));
}
}
@Override
public void update() {
if (isStopped() || isPaused()) {
return;
}
dispatchEvent(EventType.UPDATE);
// ...
}
在测试课程中:
yourClass.addEventListener(new EventListener(){
public void process(EventDetails details){
if(EventType.UPDATE.equals(details.getEventType())){
fail("Received update event");
}
}
});
// set to stopped or paused
yourClass.update();
// if we got here, test has succeeded
当然,这种方法对现在的工作方式有很大的干扰,只有你的应用程序实际上可以使用事件通知系统才会有意义(单元测试能力只是一个很好的副作用)。
或完全不同的东西:
在单元测试中,使用一个子类来覆盖if块之后调用的任何方法。
所以让我们说原始代码是这样的:
@Override
public void update() {
if (isStopped() || isPaused()) {
return;
}
doUpdate();
}
然后子类将覆盖doUpdate()
方法:
protected void doUpdate(){
fail("I shouldn't be here");
}