Quand j'ai écrit un test avec Spring Boot, je ne savais pas comment tester la méthode privée et comment se moquer de la méthode privée, je vais donc le résumer. Il semble que vous ne pouvez pas vous moquer de la méthode privée avec Mockito seul, alors utilisez PowerMock ensemble.
Préparez une classe à tester de manière appropriée. Que ce soit la classe HelloService
.
import org.springframework.beans.factory.annotation.Autowired;
public class HelloService {
@Autowired
private HelloRepository repository;
public String getFromRepo() {
return repository.getData();
}
public String methodPublic(String arg) {
return "method public: " + methodPrivate(arg);
}
private String methodPrivate(String arg) {
return "method private, arg: " + arg;
}
}
Créez une classe dont dépend la classe HelloService
.
public class HelloRepository {
public String getData() {
return "HelloRepository.getData";
}
}
methodPrivate
est une méthode privée. [Test des méthodes privées](#private method testing) décrit comment tester cette méthode.methodPublic
est une méthode publique, et la méthode privée est appelée à l'intérieur. [Chapitre sur la façon de se moquer partiellement d'une méthode privée](la méthode #Private est partiellement moquée) explique comment se moquer partiellement d'une méthode privée dans la même classe.
--getFromRepo
appelle la méthode HelloRepository dépendante. Dans [Chapitre pour utiliser avec la maquette de Mockito](utiliser avec la maquette de # mockito), testez-la d'une manière qui coexiste avec le code précédent.Ici, la méthode de test de la méthode methodPrivate
, qui est une méthode privée de la classe HelloService
de la classe cible de test mentionnée ci-dessus, sera expliquée.
import org.junit.Before;
import org.junit.Test;
import java.lang.reflect.Method;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
public class HelloServiceTest {
private HelloService service;
@Before
public void setUp() {
service = new HelloService();
}
@Test
Méthode du vide public Test privé() throws Exception {
Method method = HelloService.class.getDeclaredMethod("methodPrivate", String.class);
method.setAccessible(true);
String actual = (String)method.invoke(service, "hoge");
assertThat(actual, is("method private, arg: hoge"));
}
}
test target class.class.getDeclaredMethod (nom de la méthode cible de test, type d'argument)
.
--Si vous définissez method.setAccessible (true), vous pouvez également l'appeler avec une méthode privée., ajoutez
@SuppressWarnings ("unchecked") ʻ dans la ligne ci-dessus et il disparaîtra.Ici, nous allons expliquer comment se moquer partiellement de la méthode privée methodPrivate
appelée ci-dessus lors du test de la méthode methodPublic
de la classe cible de test HelloService
.
Puisque PowerMock est utilisé, ajoutez ce qui suit à build.gradle (Si vous utilisez maven, veuillez lire comme il convient)
dependencies {
testCompile('org.powermock:powermock-module-junit4:1.6.2')
testCompile('org.powermock:powermock-api-mockito:1.7.3')
}
Ecrire un test
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;
import java.lang.reflect.Method;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.times;
import static org.powermock.api.mockito.PowerMockito.verifyPrivate;
import static org.powermock.api.mockito.PowerMockito.when;
import static org.powermock.api.mockito.PowerMockito.spy;
@RunWith(PowerMockRunner.class)
@PrepareForTest(HelloService.class)
public class HelloServiceTest {
private HelloService service;
@Before
public void setUp() {
service = spy(new HelloService());
}
@Test
Méthode publique void Test public() throws Exception {
when(service, "methodPrivate", "fuga").thenReturn("hoge");
String actual = service.methodPublic("fuga");
verifyPrivate(service, times(1)).invoke("methodPrivate", "fuga");
assertThat(actual, is("method public: " + "hoge"));
}
}
@RunWith (PowerMockRunner.class)
et @PrepareForTest (testé.class)
spy (une instance de la classe testée)
est appelée danssetUp ()
. Le but ici est d'utiliser l'espion de PowerMock (ʻorg.powermock.api.mockito.PowerMockito.spy`) au lieu de l'espion de Mockito.when ()
, en utilisant PowerMock when. J'utilise ʻorg.powermock.api.mockito.PowerMockito.when. ――Vous pouvez faire une simulation partielle sans vous soucier de savoir si elle est privée ou publique. --Utilisez
verifyPrivate` pour vérifier qu'il a été appelé.
――La facilité d'utilisation du moment et de la vérification semble être la même que celle de MockitoAjoutez un test pour la méthode getFromRepo
.
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.powermock.api.mockito.PowerMockito.verifyPrivate;
import static org.powermock.api.mockito.PowerMockito.when;
import static org.powermock.api.mockito.PowerMockito.spy;
@RunWith(PowerMockRunner.class)
@PrepareForTest(HelloService.class)
public class HelloServiceTest {
@Mock
private HelloRepository repository;
@InjectMocks
private HelloService service;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
service = spy(service);
}
@Test
Test public void getFromRepo() {
when(repository.getData()).thenReturn("hoge");
assertThat(service.getFromRepo(), is("hoge"));
verify(service, times(1)).getFromRepo();
}
@Test
Méthode publique void Test public() throws Exception { //Comme ci-dessus}
@Test
Méthode du vide public Test privé() throws Exception { //Comme ci-dessus}
}
--Mocking du Hello Repository
dépendant.
--Annotez le champ que vous voulez simuler avec @ Mock
et annotez le champ que vous voulez simuler avec @ InjectMocks
--Si vous appelez MockitoAnnotations.initMocks (this);
dans setUp ()
, il semble qu'il injectera un simulacre.
`` J'étais inquiet s'il coexisterait avec le PowerMock ci-dessus, mais cela fonctionnait bien si je faisais simplement service = spy (service);
après initMocks.
PowerMock était pratique.
Lors de la moquerie d'une méthode non privée (Hello Repository dans ce cas), j'ai utilisé Mockito, et j'ai pensé que ce serait pratique pour @ Mock
ou @ InjectMocks
.
Quand j'ai essayé d'utiliser PowerMock pour simuler une méthode privée, j'ai pensé que ce serait déroutant si la méthode changeait radicalement, mais je suis soulagé de pouvoir l'écrire de la même manière.
Recommended Posts