如何单元测试立即退出方法

时间:2010-11-24 22:27:17

标签: java unit-testing testing

如何对以下代码进行单元测试:

@Override
public void update() {
  if (isStopped() || isPaused()) {
    return;
  }
  // ...
}

此方法来自音频流。需要定期调用它,以便流读取新数据。如果播放停止或暂停,则流不应该前进,所以我立即返回。但是,我找不到为此代码编写测试的方法。

3 个答案:

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