### Question:
ReflectionPropertyDispatcher implements PropertyDispatcher { @Override public <V> boolean isPushable(Aspect<V> aspect) { @CheckForNull Object boundObject = getBoundObject(); if (boundObject == null) { return fallbackDispatcher.isPushable(aspect); } String propertyAspectName = getPropertyAspectName(aspect); if (aspect.isValuePresent()) { return (hasReadMethod(propertyAspectName) && hasWriteMethod(propertyAspectName)) || (!hasReadMethod(propertyAspectName) && fallbackDispatcher.isPushable(aspect)); } else { return hasInvokeMethod(propertyAspectName) || fallbackDispatcher.isPushable(aspect); } } ReflectionPropertyDispatcher(Supplier<?> boundObjectSupplier, String property,
            PropertyDispatcher fallbackDispatcher); @Override String getProperty(); @CheckForNull @Override Object getBoundObject(); @Override Class<?> getValueClass(); @Override @SuppressWarnings("unchecked") V pull(Aspect<V> aspect); @Override void push(Aspect<V> aspect); @Override boolean isPushable(Aspect<V> aspect); @Override MessageList getMessages(MessageList messageList); @Override String toString();  }### Answer:
@Test public void testIsPushable_WithReadWithoutWrite() { ReflectionPropertyDispatcher dispatcher = new ReflectionPropertyDispatcher(this::getTestPmo, TestPMO.PROPERTY_PMO_GETTER_ONLY, new ExceptionPropertyDispatcher(TestPMO.PROPERTY_PMO_GETTER_ONLY)); assertThat(dispatcher.isPushable(Aspect.of("", "something")), is(false)); }
@Test public void testIsPushable_WithReadAndWrite() { ReflectionPropertyDispatcher dispatcher = new ReflectionPropertyDispatcher(this::getTestPmo, TestPMO.PROPERTY_PMO_PROP, new ExceptionPropertyDispatcher(TestPMO.PROPERTY_PMO_PROP)); assertThat(dispatcher.isPushable(Aspect.of("", "something")), is(true)); }
@Test public void testIsPushable_WithReadAndWriteNoBoundObject() { ReflectionPropertyDispatcher dispatcher = new ReflectionPropertyDispatcher(() -> null, TestPMO.PROPERTY_PMO_PROP, new ExceptionPropertyDispatcher(TestPMO.PROPERTY_PMO_PROP)); assertThat(dispatcher.isPushable(Aspect.of("", "something")), is(false)); }
@Test public void testIsPushable_NoInvokeMethod() { ReflectionPropertyDispatcher dispatcher = new ReflectionPropertyDispatcher(this::getTestPmo, TestPMO.PROPERTY_PMO_GETTER_ONLY, new ExceptionPropertyDispatcher(TestPMO.PROPERTY_PMO_GETTER_ONLY)); assertThat(dispatcher.isPushable(Aspect.of("")), is(false)); }
@Test public void testIsPushable_InvokeMethod() { ReflectionPropertyDispatcher dispatcher = new ReflectionPropertyDispatcher(this::getTestPmo, TestPMO.PROPERTY_BUTTON_CLICK, new ExceptionPropertyDispatcher(TestPMO.PROPERTY_BUTTON_CLICK)); assertThat(dispatcher.isPushable(Aspect.of("")), is(true)); }
@Test public void testIsPushable_InvokeMethodNoBoundObject() { ReflectionPropertyDispatcher dispatcher = new ReflectionPropertyDispatcher(() -> null, TestPMO.PROPERTY_BUTTON_CLICK, new ExceptionPropertyDispatcher(TestPMO.PROPERTY_BUTTON_CLICK)); assertThat(dispatcher.isPushable(Aspect.of("")), is(false)); }