diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/FindVorgangIteratorTest.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/FindVorgangIteratorTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..d519cc755840c71e0bec451fd8098e9b2379160a
--- /dev/null
+++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/FindVorgangIteratorTest.java
@@ -0,0 +1,293 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.nachrichten.postfach;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mock;
+import org.springframework.test.util.ReflectionTestUtils;
+
+import de.ozgcloud.vorgang.common.GrpcQueryOperator;
+import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangRequest;
+import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangResponse;
+import de.ozgcloud.vorgang.vorgang.GrpcQuery;
+import de.ozgcloud.vorgang.vorgang.GrpcVorgangHeader;
+import de.ozgcloud.vorgang.vorgang.GrpcVorgangQueryExpression;
+import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub;
+
+class FindVorgangIteratorTest {
+
+	private static final String SERVICEKONTO_TYPE = "servicekontoType";
+	private static final String POSTFACH_ID = "postfachId";
+
+	private FindVorgangIterator findVorgangIterator;
+
+	@Mock
+	private VorgangServiceBlockingStub vorgangServiceStub;
+
+	@BeforeEach
+	void init() {
+		findVorgangIterator = spy(new FindVorgangIterator(vorgangServiceStub, SERVICEKONTO_TYPE, POSTFACH_ID));
+	}
+
+	@Nested
+	class TestHasNext {
+
+		@Mock
+		private GrpcFindVorgangResponse findVorgangResponse;
+		@Mock
+		private GrpcFindVorgangRequest findVorgangRequest;
+		@Mock
+		private GrpcVorgangHeader vorgangHeader;
+
+		@BeforeEach
+		void inti() {
+			when(vorgangServiceStub.findVorgang(any())).thenReturn(findVorgangResponse);
+			when(findVorgangResponse.getVorgangList()).thenReturn(List.of(vorgangHeader));
+		}
+
+		@Test
+		void shouldCallShouldRequestNext() {
+			findVorgangIterator.hasNext();
+
+			verify(findVorgangIterator).shouldRequestNext();
+		}
+
+		@Test
+		void shouldCallBuildFindRequest() {
+			findVorgangIterator.hasNext();
+
+			verify(findVorgangIterator).buildFindRequest(0);
+		}
+
+		@Test
+		void shouldCallVorgangServiceStub() {
+			doReturn(findVorgangRequest).when(findVorgangIterator).buildFindRequest(anyInt());
+
+			findVorgangIterator.hasNext();
+
+			verify(vorgangServiceStub).findVorgang(findVorgangRequest);
+		}
+
+		@Test
+		void shouldSetVorgangHeaderIterator() {
+			findVorgangIterator.hasNext();
+
+			assertThat(ReflectionTestUtils.getField(findVorgangIterator, "vorgangHeaderIterator")).isNotNull();
+		}
+
+		@Test
+		void shouldSetLastVorgangListSize() {
+			findVorgangIterator.hasNext();
+
+			assertThat(ReflectionTestUtils.getField(findVorgangIterator, "lastVorgangListSize")).isEqualTo(1);
+		}
+
+		@Test
+		void shouldIncreaseOffset() {
+			doReturn(true).when(findVorgangIterator).shouldRequestNext();
+
+			findVorgangIterator.hasNext();
+			findVorgangIterator.hasNext();
+
+			assertThat(ReflectionTestUtils.getField(findVorgangIterator, "offset")).isEqualTo(1);
+		}
+	}
+
+	@Nested
+	class TestShouldRequestNext {
+
+		@Test
+		void shouldReturnTrueIfNoFindVorgangRequest() {
+			var result = findVorgangIterator.shouldRequestNext();
+
+			assertThat(result).isTrue();
+		}
+
+		@Test
+		void shouldReturnTrueIfNoNextElementLastVorgangListSizeIsLimit() {
+			ReflectionTestUtils.setField(findVorgangIterator, "vorgangHeaderIterator", Collections.emptyIterator());
+			ReflectionTestUtils.setField(findVorgangIterator, "lastVorgangListSize", FindVorgangIterator.LIMIT);
+
+			var result = findVorgangIterator.shouldRequestNext();
+
+			assertThat(result).isTrue();
+		}
+	}
+
+	@Nested
+	class TestNext {
+
+		@Mock
+		private GrpcVorgangHeader nextVorgangHeader;
+
+		@Test
+		void shouldReturnNextElement() {
+			ReflectionTestUtils.setField(findVorgangIterator, "vorgangHeaderIterator", List.of(nextVorgangHeader).iterator());
+
+			var result = findVorgangIterator.next();
+
+			assertThat(result).isSameAs(nextVorgangHeader);
+		}
+	}
+
+	@Nested
+	class TestBuildFindRequest {
+
+		private static final int OFFSET = 100;
+
+		@Test
+		void shouldSetOffset() {
+			var result = buildFindRequest();
+
+			assertThat(result.getOffset()).isEqualTo(OFFSET);
+		}
+
+		@Test
+		void shouldSetLimit() {
+			var result = buildFindRequest();
+
+			assertThat(result.getLimit()).isEqualTo(FindVorgangIterator.LIMIT);
+		}
+
+		@Test
+		void shouldCallBuildQuery() {
+			buildFindRequest();
+
+			verify(findVorgangIterator).buildQuery();
+		}
+
+		@Test
+		void shouldSetQuery() {
+			var query = GrpcQuery.newBuilder().build();
+			doReturn(query).when(findVorgangIterator).buildQuery();
+
+			var result = buildFindRequest();
+
+			assertThat(result.getQuery()).isSameAs(query);
+		}
+
+		private GrpcFindVorgangRequest buildFindRequest() {
+			return findVorgangIterator.buildFindRequest(OFFSET);
+		}
+	}
+
+	@Nested
+	class TestBuildQuery {
+
+		@Mock
+		private GrpcVorgangQueryExpression servicekontoExpression;
+		@Mock
+		private GrpcVorgangQueryExpression postfachIdExpression;
+
+		@Test
+		void shouldCallBuildServicekontoExpression() {
+			findVorgangIterator.buildQuery();
+
+			verify(findVorgangIterator).buildServicekontoExpression();
+		}
+
+		@Test
+		void shouldSetServicekontoExpression() {
+			doReturn(servicekontoExpression).when(findVorgangIterator).buildServicekontoExpression();
+
+			var result = findVorgangIterator.buildQuery();
+
+			assertThat(result.getExpressionsList()).contains(servicekontoExpression);
+		}
+
+		@Test
+		void shouldCallBuildPostfachIdExpression() {
+			findVorgangIterator.buildQuery();
+
+			verify(findVorgangIterator).buildPostfachIdExpression();
+		}
+
+		@Test
+		void shouldSetPostfachIdExpression() {
+			doReturn(postfachIdExpression).when(findVorgangIterator).buildPostfachIdExpression();
+
+			var result = findVorgangIterator.buildQuery();
+
+			assertThat(result.getExpressionsList()).contains(postfachIdExpression);
+		}
+	}
+
+	@Nested
+	class TestBuildServicekontoExpression {
+
+		@Test
+		void shouldSetPath() {
+			var result = findVorgangIterator.buildServicekontoExpression();
+
+			assertThat(result.getPath()).isEqualTo(FindVorgangIterator.PATH_SERVICEKONTO_TYPE);
+		}
+
+		@Test
+		void shouldSetOperator() {
+			var result = findVorgangIterator.buildServicekontoExpression();
+
+			assertThat(result.getOperator()).isEqualTo(GrpcQueryOperator.EQUAL);
+		}
+
+		@Test
+		void shouldSetOperandStringValue() {
+			var result = findVorgangIterator.buildServicekontoExpression();
+
+			assertThat(result.getOperandStringValue()).isEqualTo(SERVICEKONTO_TYPE);
+		}
+	}
+
+	@Nested
+	class TestBuildPostfachIdExpression {
+
+		@Test
+		void shouldSetPath() {
+			var result = findVorgangIterator.buildPostfachIdExpression();
+
+			assertThat(result.getPath()).isEqualTo(FindVorgangIterator.PATH_POSTFACH_ID);
+		}
+
+		@Test
+		void shouldSetOperator() {
+			var result = findVorgangIterator.buildPostfachIdExpression();
+
+			assertThat(result.getOperator()).isEqualTo(GrpcQueryOperator.EQUAL);
+		}
+
+		@Test
+		void shouldSetOperandStringValue() {
+			var result = findVorgangIterator.buildPostfachIdExpression();
+
+			assertThat(result.getOperandStringValue()).isEqualTo(POSTFACH_ID);
+		}
+	}
+}
\ No newline at end of file