2011-02-04 11 views
6

Tengo una clase con métodos estáticos con los que actualmente me estoy burlando con JMockit. Decir que se ve algo como:Simula un método estático varias veces usando JMockit dentro de una prueba JUnit

public class Foo { 
    public static FooValue getValue(Object something) { 
     ... 
    } 
    public static enum FooValue { X, Y, Z, ...; } 
} 

tengo otra clase (vamos a llamarlo MyClass) que llama método estático de Foo; Estoy tratando de escribir casos de prueba para esta clase. Mi prueba unitaria, usando JMockit, se ve algo como esto:

public class MyClassTest extends TestCase { 
    @NonStrict private final Foo mock = null; 

    @Test public void testMyClass() { 
     new Expectations() { 
      { 
       Foo.getValue((Object) any); result = Foo.FooValue.X; 
      } 
     }; 
    } 

    myClass.doSomething(); 
} 

Esto funciona bien y dandy, y cuando se ejecuta la prueba de mi instancia de MyClass obtendrá correctamente el valor de enumeración de Foo.FooValue.X cuando llama Foo.getValue()

Ahora, estoy tratando de iterar sobre todos los valores en la enumeración, y ejecutar repetidamente la prueba. Si coloco el código de prueba anterior en un ciclo for y trato de establecer el resultado del método estático falso para cada valor de enumeración, eso no funciona. La versión burlada de Foo.getValue() siempre devuelve Foo.FooValue.X, ​​y nunca ninguno de los otros valores cuando realizo una iteración a través de la enumeración.

¿Cómo hago para burlarme del método estático varias veces en la única prueba JUnit? Quiero hacer algo como esto (pero obviamente no funciona):

public class MyClassTest extends TestCase { 
    @NonStrict private final Foo mock = null; 

    @Test public void testMyClass() { 

     for (final Foo.FooValue val : Foo.FooValue.values() { 

      new Expectations() { 
       { 
        // Here, I'm attempting to redefine the mocked method during each iteration 
        // of the loop. Apparently, that doesn't work. 
        Foo.getValue((Object) any); result = val; 
       } 
      }; 

      myClass.doSomething(); 
     } 

    } 
} 

¿Alguna idea?

+0

¿Estás seguro de que tus expectativas funcionan correctamente (en el primer caso) con valores distintos a FooValue.X? –

Respuesta

5

En lugar de "burlarse de los métodos varias veces", debe registrar múltiples valores de retorno consecutiva en una sola grabación:

public class MyClassTest extends TestCase 
{ 
    @Test 
    public void testMyClass(@Mocked Foo anyFoo) 
    { 
     new Expectations() {{ 
      Foo.getValue(any); 
      result = Foo.FooValue.values(); 
     }}; 

     for (Foo.FooValue val : Foo.FooValue.values() { 
      myClass.doSomething(); 
     } 
    } 
} 

También se podría hacer con un Delegate, si se requiere más flexibilidad.

Cuestiones relacionadas