AsyncProperty extends ObjectProperty<T> implements AtomicProperty<T> { @Override public void removeListener(ChangeListener<? super T> listener) { delegate.removeChangeListener(listener); } AsyncProperty();  AsyncProperty(T initialValue);  AsyncProperty(Object bean, String name); @SuppressWarnings("JavadocMethod")  AsyncProperty(Object bean, String name, T initialValue); @Override void bind(ObservableValue<? extends T> observable); @Override void unbind(); @Override boolean isBound(); @Override Object getBean(); @Override String getName(); @Override T get(); @Override void set(T newValue); @Override void setValue(T v); @Override void addImmediateListener(ImmediateChangeListener<? super T> listener); @Override void removeImmediateListener(ImmediateChangeListener<? super T> listener); @Override void addListener(ChangeListener<? super T> listener); @Override void removeListener(ChangeListener<? super T> listener); @Override void removeListener(InvalidationListener listener); @Override void addListener(InvalidationListener listener);  }
@Test public void removeListenerTest() { AsyncProperty<String> asyncProperty = new AsyncProperty<>(); CompletableFuture<Boolean> listenerFired = new CompletableFuture<>(); ChangeListener<String> listener = (observable, oldValue, newValue) -> listenerFired.complete(true); asyncProperty.addListener(listener); asyncProperty.removeListener(listener); asyncProperty.set("Value"); WaitForAsyncUtils.waitForFxEvents(); assertThrows(TimeoutException.class, () -> listenerFired.get(1, TimeUnit.SECONDS)); }