package com.netflix.eventbus;

import com.netflix.eventbus.bridge.AbstractEventBusBridge;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.*;

public class DummyEventBusBridge extends AbstractEventBusBridge {

    public static class Builder extends AbstractEventBusBridge.Builder<Builder> {
        private CountDownLatch latch;
        
        public Builder withExpectedCount(int count) {
            latch = new CountDownLatch(count);
            return this;
        }
        
        @Override
        protected Builder self() {
            return this;
        }
        
        public DummyEventBusBridge build() throws Exception {
            return new DummyEventBusBridge(this);
        }
    }
    
    public static Builder builder() {
        return new Builder();
    }
    
    private final CountDownLatch latch;
    private final AtomicLong counter = new AtomicLong();
    private Exception forcedError;
    
    protected DummyEventBusBridge(final Builder init)
            throws Exception {
        super(init);
        this.latch = init.latch;
        init();
    }

    public boolean await(long timeout, TimeUnit units) throws Exception {
        return latch.await(timeout, units);
    }

    @Override
    protected void sendEvent(Object event) throws Exception {
        if (forcedError != null)
            throw forcedError;
        counter.incrementAndGet();
        latch.countDown();
    }
    
    public void setError(Exception forcedError) {
        this.forcedError = forcedError;
    }
}

package com.netflix.eventbus;

import com.netflix.eventbus.bridge.AbstractEventBusBridge;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.*;

public class DummyEventBusBridge extends AbstractEventBusBridge {

    public static class Builder extends AbstractEventBusBridge.Builder<Builder> {
        private CountDownLatch latch;
        
        public Builder withExpectedCount(int count) {
            latch = new CountDownLatch(count);
            return this;
        }
        
        @Override
        protected Builder self() {
            return this;
        }
        
        public DummyEventBusBridge build() throws Exception {
            validate();
            return new DummyEventBusBridge(this);
        }
    }
    
    public static Builder builder() {
        return new Builder();
    }
    
    private final CountDownLatch latch;
    private final AtomicLong counter = new AtomicLong();
    private Exception forcedError;
    
    protected DummyEventBusBridge(final Builder init)
            throws Exception {
        super(init);
        this.latch = init.latch;
        init();
    }

    public boolean await(long timeout, TimeUnit units) throws Exception {
        return latch.await(timeout, units);
    }

    @Override
    protected void sendEvent(Object event) throws Exception {
        if (forcedError != null)
            throw forcedError;
        counter.incrementAndGet();
        latch.countDown();
    }
    
    public void setError(Exception forcedError) {
        this.forcedError = forcedError;
    }
}

Add validate step to DummyEventBusBridge