@@ -0,0 +1,1369 @@
+package arez.integration.observable;%0A%0Aimport arez.annotations.ArezComponent;%0Aimport arez.annotations.Observable;%0Aimport arez.integration.AbstractArezIntegrationTest;%0Aimport java.util.concurrent.atomic.AtomicInteger;%0Aimport org.testng.annotations.Test;%0Aimport static org.testng.Assert.*;%0A%0A@SuppressWarnings( %22Duplicates%22 )%0Apublic class ObservableWriteOutsideTransactionTest%0A  extends AbstractArezIntegrationTest%0A%7B%0A  @ArezComponent%0A  static abstract class MyComponent%0A  %7B%0A    @Observable( writeOutsideTransaction = true )%0A    abstract long getTime();%0A%0A    abstract void setTime( long value );%0A  %7D%0A%0A  @Test%0A  public void scenario()%0A    throws Throwable%0A  %7B%0A    final MyComponent component = new ObservableWriteOutsideTransactionTest_Arez_MyComponent();%0A%0A    final AtomicInteger callCount = new AtomicInteger();%0A%0A    observer( () -%3E %7B%0A      component.getTime();%0A      callCount.incrementAndGet();%0A    %7D );%0A%0A    assertEquals( callCount.get(), 1 );%0A%0A    // Write outside transaction%0A    component.setTime( 37L );%0A%0A    // If gets here it reportObserved so observer re-ran%0A    assertEquals( callCount.get(), 2 );%0A%0A    safeAction( () -%3E assertEquals( component.getTime(), 37L ) );%0A%0A    // Write inside transaction%0A    safeAction( () -%3E component.setTime( 42L ) );%0A%0A    assertEquals( callCount.get(), 3 );%0A%0A    safeAction( () -%3E assertEquals( component.getTime(), 42L ) );%0A  %7D%0A%7D%0A

Add integration test to verify behaviour