    @Test
    public void unregister() {

        StringCatcher catcher1 = new StringCatcher();
        StringCatcher catcher2 = new StringCatcher();
        try {
            bus.unregister(catcher1);
            fail("Attempting to unregister an unregistered object succeeded");
        } catch (IllegalArgumentException expected) {
            // OK.
        }

        bus.register(catcher1);
        bus.post(EVENT);
        bus.register(catcher2);
        bus.post(EVENT);

        List<String> expectedEvents = new ArrayList<String>();
        expectedEvents.add(EVENT);
        expectedEvents.add(EVENT);

        assertEquals("Two correct events should be delivered.",
                expectedEvents, catcher1.getEvents());

        assertEquals("One correct event should be delivered.",
                Arrays.asList(EVENT), catcher2.getEvents());

        bus.unregister(catcher1);
        bus.post(EVENT);

        assertEquals("Shouldn't catch any more events when unregistered.",
                expectedEvents, catcher1.getEvents());
        assertEquals("Two correct events should be delivered.",
                expectedEvents, catcher2.getEvents());

        try {
            bus.unregister(catcher1);
            fail("Attempting to unregister an unregistered object succeeded");
        } catch (IllegalArgumentException expected) {
            // OK.
        }

        bus.unregister(catcher2);
        bus.post(EVENT);
        assertEquals("Shouldn't catch any more events when unregistered.",
                expectedEvents, catcher1.getEvents());
        assertEquals("Shouldn't catch any more events when unregistered.",
                expectedEvents, catcher2.getEvents());
    }