2016-11-08 2 views
0

Ich versuche, Tests für meine SWF-Workflow schreiben, aber stecken mit einem Problem, das ich vermute, ist wegen der asynchronen Code oder setzbare Objekte in meinem Workflow.Testen von Amazon SWF-Workflow

Mein Code sieht aus wie

@Asynchronous public Promise doSomething(final Object object,Promise success) { 

    final Settable<Throwable> exception = new Settable<Throwable>(); 
    final Settable<Boolean> result = new Settable<Boolean>(); 

    new TryCatch() { 

     @Override 
     protected void doTry() throws Throwable { 

       Promise<Boolean> waitFor = activitiesClient.doClientWork(object); 
       result.chain(waitFor); 
       setState(exception, null, waitFor); 
     } 

     @Override 
     protected void doCatch(Throwable t) throws Throwable { 

      result.set(false); 
      setState(exception, t, Promise.Void()); 
     } 
    }; 

    handleException(object, "Failed", exception); 
    return result; 
} 

Wenn ich meinen Test ausführen, die Kontrolle nie TryCatch kommt herein und geht direkt auf handle (..) Linie. Ich vermute, ich vermisse etwas über den SetTable vielleicht?

Wie in anderen Foren vorgeschlagen, habe ich versucht beide Ansätze 'WorkflowTest' und 'AsyncScope', aber immer noch nicht über ähnliche Probleme beim Schreiben Unit-Test für diesen Workflow.

Bitte helfen.

Mein Test-Code sieht aus wie

@InjectMocks 
CustomWorkflow workflow = new CustomWorkflowImpl(); 

@Mock 
MyActivitiesClient activitiesClient; 

@Test 
public void testSomething() throws Throwable { 

    AsyncScope scope = new AsyncScope() { 

     protected void doAsync() { 

     workflow.doSomething(processTransaction); 
     } 
    }; 
    scope.eventLoop(); 

    // assert 
    verify(activitiesClient, times(1)).doClientWork(processTransaction); 
} 

Jedoch habe ich eine Ausnahmemeldung 'java.lang.IllegalStateException: nicht bereit' erhalten auf handle Linie.

Bitte beachten Sie, dass ich @InjectMocks verwende, um ein Workflow-Objekt zu instanziieren, und ich vermute, dass ich aspectweaver.jar dafür im Klassenpfad nicht benötige? Hoffe das ist richtig.

Antwort

0

Code ist asynchron, daher wird erwartet, dass handleException aufgerufen wird, bevor doTry() ausgeführt wird. Wenn es jedoch mit @Asynchronous markiert ist, sollte es nicht ausgeführt werden, bis die Ausnahmeversprechung bereit ist. Stellen Sie sicher, dass @Asynchronous tatsächlich richtig eingerichtet ist.

Ich würde auch result.set (false) ändern, wenn (! Result.isReady()) {result.set (false); } um sicherzustellen, dass es nicht ausgelöst wird, wenn es bereits festgelegt ist.

+0

Wahrscheinlich ist mein @ Asynchronus-Code richtig eingerichtet, da der Workflow ziemlich alt ist und nie ein Problem hatte. Punkt zur Verwendung von result.isReady(), danke. Habe mehr Details zum ursprünglichen Beitrag hinzugefügt. – Rana

+0

java.lang.IllegalStateException: nicht bereit bedeutet, dass das Versprechen nicht bereit ist. Wenn dieses Versprechen ein Argument einer als Asynchron bezeichneten Methode ist, ist es nicht möglich, dass Asynchronous ordnungsgemäß funktioniert. Schauen Sie sich den Stack-Trace an, wenn er einen synchronen Aufruf von doSomething zu handleException zeigt, dann wird Asynchronous ignoriert. Könnte es sein, dass die AspectJ-Konfiguration das Paket des Komponententests nicht enthält? –