JUnit Test auf Blockierung

Orthak

Mitglied
Hallo,
ich verwende in einer Anwendung java.util.concurrent.ArrayBlockingQueue mit fixer Größe und möchte gerne über JUnit testen ob der Queue wirklich blockiert sobald er voll bzw. leer ist. Leider bin ich noch relativer Neuling was JUnit angeht. Ich habe erstmal versucht einfach max. erlaubte Elemente + 1 hinzuzufügen bzw. bei leerem Queue ein Element zu entnehmen. Wie gewollt blockiert der Queue dann aber und der Test kommt nie zum Ende. Kann mir Jemand erklären wie man sowas richtig bewerkstelligt?
Grüße,

Orthak
 
Hallo,

eine Variante wäre beispielsweise mit einem erwarteten Timeout zu testen. Wenn die queue blockiert, dann wird das timeout auch eingehalten, wenn nicht ist die Methode früher fertig.

Aber hier gehts ja um prinzipielle Machbarkeit... ansonsten macht es IMHO nicht viel Sinn (außer man will sicher gehen, dass sich die API nach einem Release Wechsel nioch genauso verhält wie erwartet...) Java core API Klassen zu testen.

Java:
package de.tutorials;

import static org.junit.Assert.assertTrue;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;

import org.junit.Test;

public class ArrayBlockingTest {

  @Test
  public void itShouldBeThatArrayBlockingQueueShouldBlockIfFull() {
    ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>(1
    // 2
    );
    queue.offer("a");

    try {
      long time = -System.currentTimeMillis();
      queue.offer("b", 500, TimeUnit.MILLISECONDS);
      time += System.currentTimeMillis();

      assertTrue("queue didn't block", time >= 500);

    } catch (InterruptedException e) {
      e.printStackTrace();
    }

  }
  
}

Gruß Tom
 
Zurück