Als ich einen Test mit Spring Boot schrieb, wusste ich nicht, wie man die private Methode testet und wie man die private Methode verspottet, also werde ich es zusammenfassen. Es scheint, dass Sie die private Methode nicht nur mit Mockito verspotten können, sondern PowerMock zusammen verwenden.
Bereiten Sie eine Klasse vor, die entsprechend getestet werden soll. Sei es die "HelloService" -Klasse.
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;
}
}
Erstellen Sie eine Klasse, von der die HelloService-Klasse abhängt.
public class HelloRepository {
public String getData() {
return "HelloRepository.getData";
}
}
methodPrivate
ist eine private Methode. [Testen privater Methoden](# Private Methodentest) beschreibt, wie diese Methode getestet wird.getFromRepo
ruft die abhängige HelloRepository-Methode auf. In [Kapitel der Verwendung mit Mockitos Mock](Verwendung mit # mockitos Mock) werde ich es auf eine Weise testen, die mit dem vorherigen Code koexistiert.Hier wird die Testmethode der Methode methodPrivate erläutert, bei der es sich um eine private Methode der oben genannten Testzielklasse HelloService handelt.
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
Öffentliche Leermethode Privater Test() 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 (Name der Testzielmethode, Argumenttyp)
abrufen.Hier wird erklärt, wie die oben aufgerufene private Methode methodPrivate
teilweise verspottet wird, wenn die methodPublic
-Methode der Testzielklasse HelloService
getestet wird.
Da PowerMock verwendet wird, fügen Sie build.gradle Folgendes hinzu (Wenn Sie maven verwenden, lesen Sie dies bitte entsprechend).
dependencies {
testCompile('org.powermock:powermock-module-junit4:1.6.2')
testCompile('org.powermock:powermock-api-mockito:1.7.3')
}
Schreiben Sie einen 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
Öffentliche Leermethode Öffentlicher Test() 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"));
}
}
spy (eine Instanz der zu testenden Klasse)
insetUp ()
aufgerufen. Hier geht es darum, PowerMocks Spion (org.powermock.api.mockito.PowerMockito.spy
) anstelle von Mockitos Spion zu verwenden.when ()
, wenn PowerMock when verwendet wird. Ich benutze org.powermock.api.mockito.PowerMockito.when
.
――Sie können einen Teil verspotten, ohne sich Gedanken darüber zu machen, ob es privat oder öffentlich ist.
--Verwenden Sie verifyPrivate
, um zu überprüfen, ob es aufgerufen wurde.
――Die Verwendbarkeit von Zeitpunkt und Überprüfung scheint mit Mockito identisch zu seinFügen Sie einen Test für die Methode "getFromRepo" hinzu.
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
Öffentlicher nichtiger getFromRepo-Test() {
when(repository.getData()).thenReturn("hoge");
assertThat(service.getFromRepo(), is("hoge"));
verify(service, times(1)).getFromRepo();
}
@Test
Öffentliche Leermethode Öffentlicher Test() throws Exception { //Das gleiche wie oben}
@Test
Öffentliche Leermethode Privater Test() throws Exception { //Das gleiche wie oben}
}
MockitoAnnotations.initMocks (this);
in setUp ()
aufrufen, scheint es, dass es einen Mock injiziert.
――Ich war besorgt, ob es mit dem oben genannten PowerMock koexistieren würde, aber es funktionierte gut, wenn ich nach initMocks einfach service = spy (service);
tat.PowerMock war praktisch.
Ich habe Mockito verwendet, um nicht-private Methoden zu verspotten (in diesem Fall Hello Repository-ähnliche), und ich dachte, es wäre praktisch für @ Mock
oder @ InjectMocks
.
Als ich versuchte, eine private Methode mit PowerMock zu verspotten, dachte ich, es wäre verwirrend, wenn sich die Methode drastisch ändern würde, aber ich bin erleichtert, dass ich sie auf die gleiche Weise schreiben kann.
Recommended Posts