Eine kleine Notiz von Mockito
package jp.jig.product.live.server.common.service;
import org.junit.Test;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class ApiServiceTest {
public static class ApiService {
private final String endpoint;
private final int timeout;
public ApiService(String endpoint, int timeout) {
this.endpoint = endpoint;
this.timeout = timeout;
}
public String request() {
if (endpoint == null) {
throw new IllegalStateException("endpoint is null");
}
return endpoint;
}
public boolean validTimeout() {
return timeout > 0;
}
}
@Test
public void test() {
ApiService apiService = mock(ApiService.class);
when(apiService.request()).thenCallRealMethod();
apiService.request(); // -> throw IllegalStateException
}
}
Zum Beispiel, wenn Sie ein Modell von "ApiService" wie oben gezeigt erstellen und die Methode "request ()" aufrufen. Ich denke, es gibt Situationen, in denen Sie einen Wert im Konstruktor festlegen möchten.
Zu diesem Zeitpunkt können Sie das Argument beim Erstellen eines Scheinobjekts an den Konstruktor übergeben, indem Sie "MockSetting # useConstructor" als zweites Argument von "mock ()" verwenden.
@Test
public void test() {
ApiService apiService = mock(ApiService.class, withSettings().useConstructor("http://localhost", 100));
when(apiService.request()).thenCallRealMethod();
apiService.request(); // -> http://localhost
}
Wenn Sie versuchen, die Protokollierung in den Konstruktor einzufügen, wird das Protokoll ebenfalls ausgegeben, sodass Sie sehen können, dass die Verarbeitung im Konstruktor ebenfalls ausgeführt wird.
Grundsätzlich möchte ich beim Testen die ursprüngliche Methode aufrufen, aber ich möchte nur einige der Methoden verspotten. .. .. Ich denke, da ist so etwas.
ApiService apiService = mock(ApiService.class,
withSettings().defaultAnswer(CALLS_REAL_METHODS));
Dies ist standardmäßig callRealMethod, indem CALLS_REAL_METHODS
an MockSetting # defaultAnswer
übergeben wird.
Es gibt jedoch eine Einschränkung: Sie müssen vorsichtig sein, wenn Sie "when ()" in einer Methode namens callRealMethod verwenden.
@Test
public void test() {
ApiService apiService = mock(ApiService.class, withSettings().defaultAnswer(CALLS_REAL_METHODS));
when(apiService.request()).thenReturn("hogehoge"); // -> throw IllegalStateException
}
Der obige Code scheint normal zu funktionieren, aber die Methode wird zum Zeitpunkt von "when (apiService.request ())" aufgerufen. Es scheint besser, "doReturn" zu verwenden, um dies zu vermeiden.
@Test
public void test() {
ApiService apiService = mock(ApiService.class, withSettings().defaultAnswer(CALLS_REAL_METHODS));
doReturn("hogehoge").when(apiService).request();
apiService.request(); // -> hogehoge
}
Sie können doReturn verwenden, um den Mock festzulegen, ohne callRealMethod aufzurufen.
Recommended Posts