public Controller build() {
        if (nowSupplier == null) {
            nowSupplier = Instant::now;
        }
        if (minDelay == null || minDelay.isNegative() || minDelay.isZero()) {
            minDelay = Duration.ofMillis(5);
        }
        if (maxDelay == null || maxDelay.isNegative() || maxDelay.isZero()) {
            maxDelay = Duration.ofSeconds(1000);
        }
        Assert.isTrue(minDelay.compareTo(maxDelay) <= 0,
            "Min delay must be less than or equal to max delay");
        Assert.notNull(extension, "Extension must not be null");
        Assert.notNull(reconciler, "Reconciler must not be null");

        var queue = new DefaultQueue<Request>(nowSupplier, minDelay);
        var extensionMatchers = WatcherExtensionMatchers.builder(client,
                extension.groupVersionKind())
            .onAddMatcher(onAddMatcher)
            .onUpdateMatcher(onUpdateMatcher)
            .onDeleteMatcher(onDeleteMatcher)
            .build();
        var watcher = new ExtensionWatcher(queue, extensionMatchers);
        var synchronizer = new RequestSynchronizer(syncAllOnStart,
            client,
            extension,
            watcher,
            determineSyncAllListOptions());
        return new DefaultController<>(name, reconciler, queue, synchronizer, minDelay, maxDelay,
            workerCount);
    }
@Test
    void buildTest() {
        assertThrows(IllegalArgumentException.class,
            () -> new ControllerBuilder(new FakeReconciler(), client)
                .build(),
            "Extension must not be null");

        assertNotNull(fakeBuilder().build());

        assertNotNull(fakeBuilder()
            .syncAllOnStart(true)
            .nowSupplier(Instant::now)
            .minDelay(Duration.ofMillis(5))
            .maxDelay(Duration.ofSeconds(1000))
            .build());

        assertNotNull(fakeBuilder()
            .syncAllOnStart(true)
            .minDelay(Duration.ofMillis(5))
            .maxDelay(Duration.ofSeconds(1000))
            .onAddMatcher(null)
            .onUpdateMatcher(null)
            .onDeleteMatcher(null)
            .build()
        );
    }