2012-05-26 13 views
7

Actualmente estoy escribiendo un par de pruebas relacionadas con JMock. No puedo entender la siguiente estructura del código:JMock: sintaxis extraña para agregar expectativas

context.checking(new Expectations() { //context is of type Mockery of course 
      { 
       allowing(csv).getFileName(); 
       will(returnValue(fileName)); 
      } 
     }); 

Analizando lentamente, por lo que yo sé,

context.checking(new Expectations() { ... } 

Esto generará un instantiateion anonoymous de Expectations. Pero ¿por qué tenemos otros corchetes después de esto, y luego algunos métodos extraños, estáticos, creo, como permitir(), etc.? Si alguien pudiera explicarme desde el punto de vista de Java qué está pasando aquí, estaría muy agradecido.

Respuesta

6

El segundo conjunto de llaves forma un instance initialization block, y su código es copiado por el compilador en cada constructor de la clase. Esto le da acceso a los miembros de la instancia. En el caso de la API de JMock, proporciona una forma concisa de inicializar las expectativas. Usted podría lograr lo equivalente (aunque con una advertencia al compilar el propio Expectations sobre una llamada insegura a un método reemplazable desde el constructor) con un método de plantilla.

public abstract class Expectations { 
    public Expectations() { 
     buildExpectations(); 
    } 

    protected abstract void buildExpectations(); 

    ... 
} 

Y en su prueba

context.checking(new Expectations() { 
    protected void buildExpectations() { 
     allowing(csv).getFileName(); 
     will(returnValue(fileName)); 
    } 
}); 

definitivamente prefiero la versión más corta. :)

1

Algunas personas creen que la creación de expectativas en inicializadores estáticos, con métodos estáticos ofrece al aspecto fresco, terso, sintaxis fluida y fácil de leer para especificar las expectativas - y estoy de acuerdo con ellos. La sintaxis incómoda no es solo algo genial en los marcos de burla: hay mucha manipulación de bytecode en el capó.

+1

No respondiendo realmente mi pregunta, me temo – Bober02

6

Los inicializadores de instancias son interesantes. Ellos solo colocaron realmente los he visto usar mucho es con JMock. Considere un contexto más simple y comprensible. Puede crear un mapa y añadir elementos a ella:

Map<String,String> map = new HashMap<String,String>(){ 
    { 
     put("One","Something"); 
     put("Two","Other"); 
    } 
}; 

Tal vez esto le ayudará a ver lo que está haciendo JMock.

Cuestiones relacionadas