In JUnit mit Mockito und Powermock musste ich die Verarbeitung der übergeordneten Klasse mit super
verspotten, also habe ich es mir notiert. Wenn Sie nachschlagen, können Sie sehen, dass Sie "PowerMockito.suppress ()" verwenden können. Wenn Sie jedoch "unterdrücken ()" verwenden, wird es nur übersprungen und Sie sollten das erwartete Scheinobjekt zurückgeben. Es befand sich in einem Zustand, in dem die nachfolgende Verarbeitung von JUnit nicht erfolgreich ausgeführt werden konnte.
Der Beispielcode ist unten dargestellt. Die DTO-Klasse wird weggelassen.
Übergeordnete Klasse
public class Parent {
public OutputDto execute (InputDto input) {
System.out.println("Parent#execute()");
OutputDto out = new OutputDto();
out.setText(input.getText());
return out;
}
}
Kinderklasse
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;
}
}
Der Punkt ist, dass in der untergeordneten Klasse "super.execute ()" ausgeführt wird und der Rückgabewert erwartet wird.
JUnit-Testklasse
@RunWith(PowerMockRunner.class)
@PrepareForTest({Parent.class})//Geben Sie das übergeordnete Element an
public class MockSuperTest {
//Getestete Klasse
@InjectMocks
private Child child;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void testExecute1() {
//Vorbereitung der Eingabedaten
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());
}
}
Wenn Sie die obige JUnit ausführen,
Child#execute()
replaced execute()!!
Nach dem Aufruf der untergeordneten Klasse "execute ()" wird "super.execute ()" durch den durch "PowerMockito.replace ()" angegebenen Inhalt ersetzt.
Apropos,
@PrepareForTest({Child.class})//Geben Sie ein Kind an
public class MockSuperTest {
Wenn Sie den Ort in der untergeordneten Klasse angeben, ist das Ergebnis
replaced execute()!!
Ändern Sie direkt die benachbarte untergeordnete Klasse execute ()
. Natürlich, wenn Sie es normal ausführen
Child#execute()
Parent#execute()
Ist der erwartete Wert.
das ist alles.
Recommended Posts