Creo que esto es posible con PowerMock solo si el método en el niño es diferente del método en la superclase (es decir, no se puede simular el método principal si el niño anula ese método). Para un poco más de detalle, puede mirar the relevant bug report.
Para PowerMock, consulte Suppressing Unwanted Behavior page para ver si será suficiente para sus necesidades.
Después de mucho excavar alrededor, que terminé usando JMockit para estos casos difíciles. Antes de pasar a JMockit, traté de anular todos los lugares donde se lanzaron excepciones mediante la supresión. Al final, tuve que anular algunos métodos, y no solo suprimirlos, así que terminé abandonando.
Ejemplo de uso para el caso de Android:
En primer lugar, te burlas a cabo su superclase utilizando el @MockClass
anotación:
@MockClass(realClass = Activity.class, instantiation = PerMockedInstance)
public class FakeActivity {
public Bundle mSavedInstanceState;
@Mock
public void $init() {}
@Mock
public void onCreate(Bundle savedInstanceState) {
mSavedInstanceState = savedInstanceState;
}
}
Cuando se activa, esta clase va a reemplazar el constructor por defecto de Activity
con $init()
, y reemplazar el método onCreate
con el anterior. Con android, la unidad bajo prueba se deriva de Activity (en mi código de muestra, es HelloTestActivity
). La clase de prueba es el siguiente:
public class HelloTestActivityTest3 extends AndroidTest {
@Tested
HelloTestActivity activity;
FakeActivity fakeActivity = new FakeActivity();
@Before
public void setupMocks()
{
Mockit.setUpMock(fakeActivity);
}
@Test
public void onCreate_bundle(@Mocked Bundle savedInstanceState)
{
// Try to access out-of-band information from the fake
activity.onCreate(savedInstanceState);
assertSame(savedInstanceState, fakeActivity.mSavedInstanceState);
}
}
La llamada Mockit.setupMock(fakeActivity)
sustituye a la superclase con mi instancia de la falsificación. Con este uso, también puedes acceder al estado interno de tu clase falsa. Si no necesita anular ningún método con funcionalidad personalizada, puede usar otros métodos disponibles de la clase Mockit
.
Como señaló rogerio en los comentarios a continuación, burlarse de la clase Activity
es lo mínimo. El siguiente código demuestra esto.
public class HelloTestActivityTest4 {
@Tested
HelloTestActivity activity;
@Mocked
Activity base;
@Test
public void testOnCreate() throws Exception {
// Just make sure "Stub!" exception is not thrown.
activity.onCreate(null);
}
}
La declaración @Mocked Activity base;
hace que todos los métodos (exceptuando inicializadores estáticos) de Activity
clase y sus superclases ser burlado en los ensayos definidos en HelloActivityTest4
.
cómo funciona su súper maqueta llamada()? ¿Puedes dar un ejemplo de código? – nansen
@nansen No estoy llamando 'super()' desde el simulacro, el simulacro es la superclase. Por favor mira mis ediciones –
No me gusta esa clase 'S' mucho. – DerMike