Versuchen Sie beim Verspotten mit Mockito + PowerMock in einem Java-Komponententest diejenigen, die Sie wahrscheinlich verwenden, so kurz wie möglich zusammenzufassen. (Ich plane, es nach Bedarf hinzuzufügen)
Fügen Sie für Gradle die folgende Abhängigkeit zu build.gradle hinzu.
build.gradle
dependencies {
testImplementation 'junit:junit:4.12'
testImplementation "org.mockito:mockito-core:2.28.+"
testImplementation 'org.powermock:powermock-module-junit4:2.0.2'
testImplementation 'org.powermock:powermock-api-mockito2:2.0.2'
}
Verspotten wir die statische Methode "ExampleDBA.findAll ()", die von der Methode aufgerufen wird, wenn die folgende Methode getestet wird.
Getestete Klasse
import java.util.List;
public class ExampleLogic {
public Integer countExamples() {
List<ExampleDTO> list = ExampleDBA.findAll();
return list.size();
}
}
Testklasse
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;
import static org.powermock.api.mockito.PowerMockito.when;
import java.util.Arrays;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class) //(1)
@PrepareForTest({ ExampleDBA.class }) //(2)
public class ExampleLogicTest {
ExampleLogic logic = new ExampleLogic();
@Before
public void setUp() throws Exception {
PowerMockito.mockStatic(ExampleDBA.class); //(3)
}
@Test
public void countExamples() {
List<ExampleDTO> result = Arrays.asList(new ExampleDTO());
when(ExampleDBA.findAll()).thenReturn(result); //(4)
assertThat(logic.countExamples(), equalTo(1));
}
}
(1) Es ist eine Magie, die bei der Verwendung von PowerMock erforderlich ist. (2) Geben Sie eine Klasse an, die eine statische Methode zum Verspotten hat. (3) Geben Sie eine Klasse an, die eine statische Methode zum Verspotten hat. (4) Geben Sie den Rückgabewert an, wenn die statische Methode ausgeführt wird.
Getestete Klasse
public class ExampleService {
public Integer count() {
ExampleLogic logic = new ExampleLogic();
return logic.countExamples();
}
}
Testklasse
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.Mockito.mock;
import static org.powermock.api.mockito.PowerMockito.when;
import static org.powermock.api.mockito.PowerMockito.whenNew;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class) //(1)
@PrepareForTest({ ExampleService.class }) //(2)
public class ExampleServiceTest {
ExampleService service = new ExampleService(); //(3)
@Test
public void count() throws Exception {
ExampleLogic logic = mock(ExampleLogic.class); //(4)
whenNew(ExampleLogic.class).withNoArguments().thenReturn(logic); //(5)
when(logic.countExamples()).thenReturn(0); //(6)
assertThat(service.count(), equalTo(0));
}
}
(1) Es ist eine Magie, die bei der Verwendung von PowerMock erforderlich ist. (2) Geben Sie die zu testende Klasse an. (3) Erstellen Sie eine Instanz der zu testenden Klasse. (4) Erstellen Sie ein Scheinobjekt. (5) Legen Sie fest, dass ein Scheinobjekt im Neuzustand zurückgegeben wird. (6) Legen Sie den Rückgabewert fest, wenn die Methode des Scheinobjekts aufgerufen wird. (*) Es ist notwendig, (4) bis (6) auszuführen, bevor das zu verspottende Objekt neu erstellt wird. Zum Beispiel, wenn Sie ExampleLogic im Konstruktor von ExampleService neu erstellen ExampleService muss (3) nach (6) stehen.
Getestete Klasse
public class ExampleLogic2 {
private String privateMethod() {
return "abc";
}
public String publicMethod() {
String str = privateMethod();
return str.toUpperCase();
}
}
Testklasse
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.powermock.api.mockito.PowerMockito.spy;
import static org.powermock.api.mockito.PowerMockito.when;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class) //(1)
@PrepareForTest(ExampleLogic2.class) //(2)
public class ExampleLogicTest2 {
@Test
public void publicMethod() throws Exception {
ExampleLogic2 logic = spy(new ExampleLogic2()); //(3)
when(logic, "privateMethod").thenReturn("str"); //(4)
assertThat(logic.publicMethod(), equalTo("STR"));
}
}
(1) Es ist eine Magie, die bei der Verwendung von PowerMock erforderlich ist. (2) Geben Sie die zu testende Klasse an. (3) Um einige Methoden zu verspotten, neu die Testzielklasse und den Spion aufrufen. (4) Legen Sie den Rückgabewert der zu verspottenden Methode fest (in diesem Beispiel privat).
Recommended Posts