Unit Testing for external tasks with same topic in parallel

Hi,
i would like to write an unit test for my process model. I attached the relevant section.

As you can see there are a few service tasks executed in parallel. All service tasks are external and have the same topic. Unfortunatelly, when I am executing the following line in test an exception occurs.

Test statement:
complete(externalTask(ServiceTasks.ACTIVITY_0EZE1FT), variableSnapshot);

Exception:
java.lang.IllegalStateException: Multiple external tasks found for externalTask = ‘ExternalTaskEntity [id=42, revision=1, topicName=externalTopic, workerId=null, lockExpirationTime=null, priority=0, errorMessage=null, errorDetailsByteArray=null, errorDetailsByteArrayId=null, executionId=40]’, variables = ‘{x=5}’
at org.camunda.bpm.engine.test.assertions.bpmn.BpmnAwareTests.complete(BpmnAwareTests.java:949)
at de.mytest.Testcollection.mytest(Testcollection.java:212)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
at org.camunda.bpm.engine.test.ProcessEngineRule$1.evaluate(ProcessEngineRule.java:170)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
at org.camunda.bpm.engine.test.ProcessEngineRule$1.evaluate(ProcessEngineRule.java:170)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:542)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)

Taking a look into BPMNAwareTests.class you can see that the external tasks is locked by topic name. After that a check ensures that the locked external task has the same ID as the given one from my test statement. Because I am using multiple external tasks with the same topic the check fails and the exception occurs.

What am I doing wrong? Or is it a bug? I’m using org.camunda.bpm.assert in version 8.0.0.

Thank you for helping me.

This appears to be working as designed. There’s a note in the docs for the complete method you’re using. It may help you get going in the right direction:

Helper method to easily fetch, lock and complete an external task.
Note: if multiple external tasks exist that can be locked for the topic of
the given external task, this method might throw an
{@link IllegalStateException} if an external task with a different id is
locked by chance. In this case, it is more advisable to use the
{@link #fetchAndLock(String, String, int) fetchAndLock} and
{@link #complete(LockedExternalTask, Map)} methods to achieve reliable results.

1 Like