Prueba unitaria que verifica solo unos pocos elementos

Hay una interfaz:

interface IEventListener
{
  void onEvent(List <IEvent> events);
}

Hay una clase de evento:

class EventB
{
  private final int id;
  private final A a;
  private final String somethingElse;
...
// constructors, getters
...
}

Y hay una clase para probar:

class Doer
{
 IEventListener eventListener;
 void doSomething(Aaa a)
 {
   eventListener.onEvent(Arrays.asList(new EventA(1), new EventC(2)));
...
   eventListener.onEvent(Arrays.asList(new EventB(42, a.getA(), "foo"), new EventA(3), new EventB(0, a.getA(), "bar")));
...
   eventListener.onEvent(Arrays.asList(new EventC(4)));
 }
}

El Doeres un código que necesito probar, el método doSomethingproduce paquetes de eventos y necesito probar si produce un evento particular en algunas condiciones específicas.

Más precisamente, quiero tener una prueba unitaria que llame al método doSomethingy verifique que EventB se envíe con "42" y a Apartir del argumento del método a. Todos los demás eventos deben ser ignorados.

Para hacer tal prueba, solo se me ocurrió una solución que involucra un código bastante detallado con ArgumentCaptor, for-blocks y banderas mágicas booleanas ...

¿Cuál es la mejor manera de hacer una prueba unitaria? Tal vez el diseño del código es malo?

Respuesta 1

El diseño es correcto, así es como lo prueba con Mockito:

import org.hamcrest.Matchers;
import org.mockito.Mockito;
public void firesEventsOnDoSomething() {
  Listener listener = Mockito.mock(Listener.class);
  Doer doer = new Doer(listener);
  doer.doSomething(aaa);
  Mockito.verify(listener).onEvent(
    Mockito.argThat(
      Matchers.hasItem(
        Matchers.allOf(
          Matchers.instanceOf(EventB.class),
          Matchers.hasProperty("a", Matchers.equalTo(aaa.getA())),
          // whatever you want
        )
      )
    )
  );
}

Es Mockito 1.9.0 y Hamcrest-library 1.2.1.

Para usar JUnit 4.10 junto con Hamcrest-library 1.2.1 debe usar junit:junit-dep:4.10artefactos y excluirlos org.hamcrest:hamcrest-core:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit-dep</artifactId>
  <version>4.10</version>
  <scope>test</scope>
  <exclusions>
    <exclusion>
      <groupId>org.hamcrest</groupId>
      <artifactId>hamcrest-core</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>org.hamcrest</groupId>
  <artifactId>hamcrest-core</artifactId>
  <version>1.2.1</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.hamcrest</groupId>
  <artifactId>hamcrest-library</artifactId>
  <version>1.2.1</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-core</artifactId>
  <version>1.9.0</version>
  <scope>test</scope>
  <exclusions>
    <exclusion>
      <groupId>org.hamcrest</groupId>
      <artifactId>hamcrest-core</artifactId>
    </exclusion>
  </exclusions>
</dependency>
Respuesta: 2

Si está utilizando JUnit4, puede probar una prueba paremetrizada. Aquí hay un ejemplo http://www.mkyong.com/unittest/junit-4-tutorial-6-parameterized-test/ .

Si para cada uno de sus parámetros tiene que comparar con un resultado diferente, debería considerarlos como diferentes casos de prueba.

Respuesta: 3

Actualmente estoy usando este código para la detección de colisión en 2D en mis juegos de Space Invaders: for (byte k = 0; k <enemmes.length; k ++) {if (shot.x <enemigos [k] .getTexture (). GetImageWidth ( ) Y ...

Necesito generar un gran xml. Actualmente estoy usando JAXB 2.0. El problema es que si mantengo todos los objetos en la memoria y genero la probabilidad de que se quede sin espacio de almacenamiento dinámico es muy alta. Me gustaría ...

Necesito realizar un análisis espectral de un archivo wav simple. Lo que ya he hecho: Leer el archivo en la matriz de bytes: ByteArrayOutputStream baos = new ByteArrayOutputStream (); byte [] buffer = nuevo ...

Estoy completando datos de mi base de datos en mi JTable. Después de agregar nuevos datos y presionar el botón Actualizar, quiero eliminar la fila existente que se muestra en la tabla antes de recuperar los nuevos datos. Cómo puedo ...