Un petit mot de 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
}
}
Par exemple, lors de la création d'une maquette de ʻApiServicecomme indiqué ci-dessus et de l'appel de la méthode
request ()`.
Je pense qu'il existe des situations où vous souhaitez définir une valeur dans le constructeur.
À ce stade, vous pouvez passer l'argument au constructeur lors de la création d'un objet fictif en utilisant MockSetting # useConstructor
comme deuxième argument de mock ()
.
@Test
public void test() {
ApiService apiService = mock(ApiService.class, withSettings().useConstructor("http://localhost", 100));
when(apiService.request()).thenCallRealMethod();
apiService.request(); // -> http://localhost
}
Si vous essayez de mettre la journalisation dans le constructeur, le journal sera également sorti, vous pouvez donc voir que le traitement dans le constructeur est également en cours d'exécution.
Je veux essentiellement appeler la méthode originale lors du test, mais je ne veux me moquer que de certaines méthodes. .. .. Je pense qu'il y a quelque chose comme ça.
ApiService apiService = mock(ApiService.class,
withSettings().defaultAnswer(CALLS_REAL_METHODS));
Cette valeur par défaut est callRealMethod en passant CALLS_REAL_METHODS
à MockSetting # defaultAnswer
.
Cependant, il y a une mise en garde, vous devez être prudent lorsque vous utilisez when ()
dans une méthode qui est callRealMethod.
@Test
public void test() {
ApiService apiService = mock(ApiService.class, withSettings().defaultAnswer(CALLS_REAL_METHODS));
when(apiService.request()).thenReturn("hogehoge"); // -> throw IllegalStateException
}
Le code ci-dessus semble fonctionner normalement, mais la méthode est appelée au moment de when (apiService.request ())
.
Il semble préférable d'utiliser doReturn
pour éviter cela.
@Test
public void test() {
ApiService apiService = mock(ApiService.class, withSettings().defaultAnswer(CALLS_REAL_METHODS));
doReturn("hogehoge").when(apiService).request();
apiService.request(); // -> hogehoge
}
Vous pouvez utiliser doReturn pour définir la simulation sans appeler callRealMethod.
Recommended Posts