Dans JUnit utilisant Mockito et Powermock, j'ai dû me moquer du traitement de la classe parente en utilisant super
, alors j'en ai pris note. Si vous le recherchez, vous pouvez voir que vous pouvez utiliser PowerMockito.suppress ()
, mais si vous utilisez suppress ()
, il ne sera ignoré et vous devriez retourner l'objet fictif que vous attendiez. Il était dans un état où le traitement ultérieur de JUnit n'a pas pu être exécuté avec succès.
L'exemple de code est illustré ci-dessous. La classe DTO est omise.
Classe parent
public class Parent {
public OutputDto execute (InputDto input) {
System.out.println("Parent#execute()");
OutputDto out = new OutputDto();
out.setText(input.getText());
return out;
}
}
Classe enfant
public class Child extends Parent {
public OutputDto execute (InputDto input) {
System.out.println("Child#execute()");
OutputDto out = super.execute(input);
out.setText(out.getText()+" updated in Child.");
return out;
}
}
Le fait est que dans la classe enfant, super.execute ()
est fait et la valeur de retour est attendue.
Classe de test JUnit
@RunWith(PowerMockRunner.class)
@PrepareForTest({Parent.class})//Spécifier le parent
public class MockSuperTest {
//Classe testée
@InjectMocks
private Child child;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void testExecute1() {
//Préparation des données d'entrée
InputDto input = new InputDto();
input.setText("hello");
OutputDto result = new OutputDto();
result.setText("hello updated in Child.");
try {
Method method = child.getClass().getMethod("execute", InputDto.class);
PowerMockito.replace(method).with(
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("replaced execute()!!");
return result;
}
});
} catch (Exception e) {
e.printStackTrace();
fail();
}
OutputDto testOut = child.execute(input);
assertEquals(result.getText(), testOut.getText());
}
}
Lorsque vous exécutez le JUnit ci-dessus,
Child#execute()
replaced execute()!!
Ensuite, après avoir appelé ʻexecute () de la classe enfant,
super.execute () est remplacé par le contenu spécifié par
PowerMockito.replace ()`.
Au fait,
@PrepareForTest({Child.class})//Spécifiez un enfant
public class MockSuperTest {
Si vous spécifiez la place dans la classe enfant, le résultat sera
replaced execute()!!
Modifiez directement la classe voisine ʻexecute () `. Bien sûr, si vous l'exécutez normalement
Child#execute()
Parent#execute()
Est la valeur attendue.
c'est tout.
Recommended Posts