Pregunta

Estoy usando Mockito para escribir una prueba de unidad en Java, y me gustaría comprobar que un determinado método es el última llamado en un objeto.

Yo estoy haciendo algo parecido a esto en el código bajo prueba:

row.setSomething(value);
row.setSomethingElse(anotherValue);
row.editABunchMoreStuff();
row.saveToDatabase();

En mi maqueta, no me importa el orden en que puedo editar todo en la fila, pero es muy importante que yo no tratar de hacer algo más para ella después de que lo hayas guardado.Hay una buena manera de hacer esto?

Tenga en cuenta que yo no estoy buscando verifyNoMoreInteractions:no confirmar que saveToDatabase es la última cosa que se llama, y también falla si me llaman nada en la fila en la que yo no verificar explícitamente.Me gustaría ser capaz de decir algo como:

verify(row).setSomething(value);
verify(row).setSomethingElse(anotherValue);
verifyTheLastThingCalledOn(row).saveToDatabase();

Si ayuda, estoy cambiando a Mockito de un JMock prueba que hizo esto:

row.expects(once()).method("saveToDatabase").id("save");
row.expects(never()).method(ANYTHING).after("save");
¿Fue útil?

Solución

Creo que requiere más trabajos a medida.

verify(row, new LastCall()).saveToDatabase();

y

public class LastCall implements VerificationMode {
    public void verify(VerificationData data) {
        List<Invocation> invocations = data.getAllInvocations();
        InvocationMatcher matcher = data.getWanted();
        Invocation invocation = invocations.get(invocations.size() - 1);
        if (!matcher.matches(invocation)) throw new MockitoException("...");
    }
}

respuesta anterior:

Tiene usted razón. verifyNoMoreInteractions es lo que necesita.

verify(row).setSomething(value);
verify(row).setSomethingElse(anotherValue);
verify(row).editABunchMoreStuff();
verify(row).saveToDatabase();
verifyNoMoreInteractions(row);

Otros consejos

No es 100% sobre el tema, sino que solo estaba buscando para encontrar lo contrario de verificar, y este era el único resultado relevante, que termina que fue después Mockito.verifyZeroInteractions (simulado);

Sólo en caso cualquier otra persona termina aquí en busca de esto ...

Esta pregunta me llevó a hacer algunas mejoras en el Las verificaciones JMockit (disponible en la próxima versión 0.983).

La solución que se me ocurrió permite escribir (en un método de prueba):


    new VerificationsInOrder() {{
        unverifiedInvocations();
        row.saveToDababase();
    }};

... si sólo desea verificar que un determinado método se llama después de todo lo demás. Para verificar que sucede antes todas las otras invocaciones, basta con mover la llamada a la parte superior. En realidad, esto se aplica a cualquier secuencia de invocaciones consecutivos.

Si además de la verificación anterior, también desea comprobar que algunos otros métodos son llamados en cualquier orden, un segundo verificaciones bloque se puede añadir a la prueba (antes o después del otro bloque , no importa):


    new Verifications() {{
        row.setSomething(value);
        row.setSomethingElse(anotherValue);
    }};

Aunque un poco largo debido a la utilización de clases internas anónimas, esta sintaxis es simple y flexible; observe cómo se agrega a la estructura de la prueba y evita la repetición de las llamadas de método (como verify(...)). Hay más a él que he descrito aquí (Hamcrest adaptadores de, los recuentos de invocación, etc.), y no se limita a la verificación de los métodos de instancia (métodos estáticos y constructores puede ser burlado y verificaron de la misma manera).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top