Si vous souhaitez utiliser Junit 5 dans votre application vous pouvez commencer par lire mon article sur le sujet :-). Pour ne plus avoir de dépendance vers des anciennes versions de Junit, vous pouvez ajouter à votre projet Gradle cette configuration
configurations {
all {
exclude module: "junit"
}
}
testCompile("org.junit.jupiter:junit-jupiter-api")
testRuntime("org.junit.jupiter:junit-jupiter-engine")
Mais dans ce cas là vous ne pourrez plus utiliser la librairie précédente car elle a besoin de Junit 4 pour compiler. Il faut savoir que les versions 5 et 4 ne sont pas rétrocompatibles et les Rule Junit4 ont été remplacées par des extensions dans Junit 5.
Junit 5 a été réécrit pour profiter pleinement de Java 8. Le support Java 8 est encore à ses débuts dans Android, et Square ne va pas faire évoluer tout de suite sa librairie pour être compatible Junit 5. Pour palier à ce problème vous pouvez utiliser le fork mis en place par Dev-Mind. Ce projet utilise le projet okhttp mais ne dépend pas de Junit 4, et propose deux extensions pour vos tests.
Vous pouvez charger cette librairie sur Maven Central. Pour l’utiliser dans un projet Gradle vous pouvez déclarer cette dépendance
testCompile("com.devmind:mockwebserver:0.1.0")
La première extension MockWebServerExtension
se charge d’instancier un serveur web, de le démarrer et de l’arrêter avant et après chaque test.
@ExtendWith(MockWebServerExtension.class)
class MySpringWebfluxServiceTest {
private MockWebServer server;
private WebClient webClient;
private MySpringWebfluxService service;
@BeforeEach
public void setup(MockWebServer server) {
this.webClient = WebClient.create(server.url("/").toString());
this.service = new MySpringWebfluxService(webClient);
this.server = server;
}
@Test
public void mytest() throws Exception {
prepareResponse(response -> response
.setHeader("Content-Type", "application/json")
.setBody( "{\n" +
" \"error_message\" : \"The provided API key is invalid.\",\n" +
" \"predictions\" : [],\n" +
" \"status\" : \"REQUEST_DENIED\"\n" +
"}"));
StepVerifier.create(service.myMethod())
.expectComplete()
.verify(Duration.ofSeconds(3));
}
private void prepareResponse(Consumer consumer) {
MockResponse response = new MockResponse();
consumer.accept(response);
this.server.enqueue(response);
}
}
Avec la deuxième extension MockSimpleWebServerExtension
plus basique, vous gérez vous même l’arrêt relance du serveur. Ceci permet par exemple de lancer le serveur avant le lancement de tous les tests et de l’arrêter à la fin de l’exécution
@ExtendWith(MockSimpleWebServerExtension.class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class MySpringWebfluxServiceTest {
private MockWebServer server;
private WebClient webClient;
private MySpringWebfluxService service;
@BeforeAll
public void init(MockWebServer server) throws IOException {
server.start();
this.server = server;
}
@AfterAll
public void tearDown() throws IOException {
server.shutdown();
}
@BeforeEach
public void setup(MockWebServer server) {
this.webClient = WebClient.create(server.url("/").toString());
this.service = new MySpringWebfluxService(webClient);
}
@Test
public void mytest() throws Exception {
prepareResponse(response -> response
.setHeader("Content-Type", "application/json")
.setBody( "{\n" +
" \"error_message\" : \"The provided API key is invalid.\",\n" +
" \"predictions\" : [],\n" +
" \"status\" : \"REQUEST_DENIED\"\n" +
"}"));
StepVerifier.create(service.myMethod())
.expectComplete()
.verify(Duration.ofSeconds(3));
}
private void prepareResponse(Consumer<MockResponse> consumer) {
MockResponse response = new MockResponse();
consumer.accept(response);
this.server.enqueue(response);
}
}
Voila vous n’avez plus d’excuse pour ne pas tester vos services Spring utilisant WebClient en Junit 5. Le fork proposé par Dev-Mind peut être utilisé en attendant que Square mette à jour sa librairie.