ここでは、複雑なアプローチです:
1つのアイデアは、Observer
パターンを実装し、テストされたクラスのイベントをサブスクライブできるリスナインタフェースを定義することです。このアプローチは、物事が今取り組んでいる途中に巨大侵入され、そしてもちろん
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
:
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);
// ...
}
とテストクラス内:イベントは、このケースであればブロックの後に送信されますアプリケーションが実際にイベント通知システムを使用できるかどうかだけです(ユニットテスト機能は素晴らしい副作用です)。
または完全に別の何か:ユニットテストで
、もしブロックの後に呼ばれているものメソッドオーバーライドするサブクラスを使用します。
それでは、元のコードはこれですと言ってみましょう:
@Override
public void update() {
if (isStopped() || isPaused()) {
return;
}
doUpdate();
}
その後、サブクラスがdoUpdate()
メソッドオーバーライドします:
protected void doUpdate(){
fail("I shouldn't be here");
}
をそのメソッドは可視状態を変更しないよう私たちはより多くのコードを参照する必要があります - ので、インスタンス変数にはどのようなものがあり、isStoppedとisPausedには何がありますか? – Mark
'// ...'が何をしても、それが起こっていないことを検証しますか? –
ユニットテストの総カバレッジは達成するのが難しく、おそらく努力する価値はありません。ファンキーなやりとりが行われていない限り、これはあなたが「あまりにも硬い」バスケットに入れることができるケースのように見えます。 –