Skip to content

Commit 4132a6c

Browse files
BAEL-8167 - Comparing Java Stream and Flux fromIterable (#18385)
* BAEL-8167 - Comparing Java Stream and Flux.fromIterable() * BAEL-8167 - Comparing Java Stream and Flux.fromIterable() * Moved classes to the rearranged module under spring-reactive-modules * Deleted from local project spring-webflux/src/test/java/com/baeldung/spring/streamvsfluxfromiterable directory
1 parent 9a59fa1 commit 4132a6c

File tree

2 files changed

+136
-0
lines changed

2 files changed

+136
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package com.baeldung.spring.streamvsfluxfromiterable;
2+
3+
import java.time.Duration;
4+
import java.util.List;
5+
6+
import org.junit.jupiter.api.Test;
7+
8+
import reactor.core.publisher.Flux;
9+
import reactor.test.StepVerifier;
10+
import reactor.test.scheduler.VirtualTimeScheduler;
11+
12+
@SuppressWarnings("unchecked")
13+
public class FluxFromIterableUnitTest {
14+
15+
@Test
16+
void givenList_whenProcessedWithFlux_thenReturnDoubledEvenNumbers() {
17+
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
18+
Flux<Integer> fluxPipeline = Flux.fromIterable(numbers)
19+
.filter(n -> n % 2 == 0)
20+
.map(n -> n * 2);
21+
22+
StepVerifier.create(fluxPipeline)
23+
.expectNext(4, 16);
24+
}
25+
26+
@Test
27+
void givenList_whenProcessingTakesLongerThanEmission_thenEmittedBeforeProcessing() {
28+
VirtualTimeScheduler.set(VirtualTimeScheduler.create());
29+
30+
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
31+
Flux<Integer> sourceFlux = Flux.fromIterable(numbers)
32+
.delayElements(Duration.ofMillis(500));
33+
34+
Flux<Integer> processedFlux = sourceFlux.flatMap(n -> Flux.just(n * n)
35+
.delayElements(Duration.ofSeconds(1)));
36+
37+
StepVerifier.withVirtualTime(() -> Flux.merge(sourceFlux, processedFlux))
38+
.expectSubscription()
39+
.expectNoEvent(Duration.ofMillis(500))
40+
.thenAwait(Duration.ofMillis(500 * 5))
41+
.expectNextCount(7)
42+
.thenAwait(Duration.ofMillis(5000))
43+
.expectNextCount(3)
44+
.verifyComplete();
45+
46+
}
47+
48+
@Test
49+
void givenList_whenDividedByZeroInFlux_thenReturnFallbackValue() {
50+
List<Integer> numbers = List.of(1, 2, 0, 4, 5);
51+
Flux<Integer> flux = Flux.fromIterable(numbers)
52+
.map(n -> 10 / n)
53+
.onErrorResume(e -> Flux.just(-1));
54+
55+
StepVerifier.create(flux)
56+
.expectNext(10, 5, -1)
57+
.verifyComplete();
58+
}
59+
60+
@Test
61+
void givenFlux_whenMultipleSubscribers_thenEachReceivesData() {
62+
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
63+
Flux<Integer> flux = Flux.fromIterable(numbers)
64+
.map(n -> n * 2);
65+
66+
StepVerifier.create(flux)
67+
.expectNext(2, 4, 6, 8, 10)
68+
.verifyComplete();
69+
70+
StepVerifier.create(flux)
71+
.expectNext(2, 4, 6, 8, 10)
72+
.verifyComplete();
73+
}
74+
75+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.baeldung.spring.streamvsfluxfromiterable;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertThrows;
5+
import static org.mockito.Mockito.mock;
6+
import static org.mockito.Mockito.times;
7+
import static org.mockito.Mockito.verify;
8+
import static org.mockito.Mockito.verifyNoInteractions;
9+
10+
import java.util.List;
11+
import java.util.function.Function;
12+
import java.util.stream.Stream;
13+
14+
import org.junit.jupiter.api.Test;
15+
16+
@SuppressWarnings("unchecked")
17+
public class JavaStreamUnitTest {
18+
19+
@Test
20+
void givenList_whenProcessedWithStream_thenReturnDoubledEvenNumbers() {
21+
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
22+
23+
List<Integer> doubledEvenNumbers = numbers.stream()
24+
.filter(n -> n % 2 == 0)
25+
.map(n -> n * n)
26+
.toList();
27+
assertEquals(List.of(4, 16), doubledEvenNumbers);
28+
}
29+
30+
@Test
31+
void givenList_whenNoTerminalOperator_thenNoResponse() {
32+
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
33+
Function<Integer, Integer> mockMapper = mock(Function.class);
34+
Stream<Integer> streamPipeline = numbers.stream()
35+
.map(mockMapper);
36+
verifyNoInteractions(mockMapper);
37+
38+
List<Integer> mappedList = streamPipeline.toList();
39+
verify(mockMapper, times(5));
40+
}
41+
42+
@Test
43+
void givenList_whenDividedByZeroInStream_thenThrowException() {
44+
List<Integer> numbers = List.of(1, 2, 0, 4, 5);
45+
assertThrows(ArithmeticException.class, () -> numbers.stream()
46+
.map(n -> 10 / n)
47+
.toList());
48+
}
49+
50+
@Test
51+
void givenStream_whenReused_thenThrowException() {
52+
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
53+
Stream<Integer> doubleStream = numbers.stream()
54+
.map(n -> n * 2);
55+
56+
assertEquals(List.of(2, 4, 6, 8, 10), doubleStream.toList());
57+
58+
assertThrows(IllegalStateException.class, doubleStream::toList);
59+
}
60+
61+
}

0 commit comments

Comments
 (0)