Lorsque vous vous moquez de Mockito + PowerMock dans un test unitaire Java, essayez de résumer ceux que vous êtes susceptible d'utiliser aussi brièvement que possible. (Je prévois de l'ajouter au besoin)
Pour Gradle, ajoutez la dépendance suivante à build.gradle.
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'
}
Simulons la méthode statique "ExampleDBA.findAll ()" appelée depuis la méthode lors du test de la méthode suivante.
Classe testée
import java.util.List;
public class ExampleLogic {
public Integer countExamples() {
List<ExampleDTO> list = ExampleDBA.findAll();
return list.size();
}
}
Classe d'essai
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) C'est une magie nécessaire lors de l'utilisation de PowerMock. (2) Spécifiez une classe qui a une méthode statique à simuler. (3) Spécifiez une classe qui a une méthode statique à simuler. (4) Spécifiez la valeur de retour lorsque la méthode statique est exécutée.
Classe testée
public class ExampleService {
public Integer count() {
ExampleLogic logic = new ExampleLogic();
return logic.countExamples();
}
}
Classe d'essai
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) C'est une magie nécessaire lors de l'utilisation de PowerMock. (2) Spécifiez la classe à tester. (3) Créez une instance de la classe à tester. (4) Créez un objet simulé. (5) Défini pour renvoyer un objet simulé lorsqu'il est neuf. (6) Définissez la valeur de retour lorsque la méthode de l'objet fictif est appelée. (*) Il faut exécuter (4) à (6) avant de renouveler l'objet à moquer. Par exemple, si vous créez un nouveau ExampleLogic dans le constructeur de ExampleService ExampleService doit être (3) après (6).
Classe testée
public class ExampleLogic2 {
private String privateMethod() {
return "abc";
}
public String publicMethod() {
String str = privateMethod();
return str.toUpperCase();
}
}
Classe d'essai
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) C'est une magie nécessaire lors de l'utilisation de PowerMock. (2) Spécifiez la classe à tester. (3) Afin de se moquer de certaines méthodes, créez une nouvelle classe cible de test et appelez spy. (4) Définissez la valeur de retour de la méthode à simuler (privée dans cet exemple).
Recommended Posts