camunda-community-hub/camunda-process-test-coverage

Problem with RegisterExtension

arolfes opened this issue · 8 comments

When I use @RegisterExtension I can have only one testmethod per class

In the example below the second testmethod fails always with

exception

kotlin.UninitializedPropertyAccessException: lateinit property activeSuite has not been initialized

	at org.camunda.bpm.extension.process_test_coverage.model.DefaultCollector.getActiveSuite(DefaultCollector.kt:17)
	at org.camunda.bpm.extension.process_test_coverage.junit5.ProcessEngineCoverageExtension.beforeTestExecution(ProcessEngineCoverageExtension.kt:89)

Testcase

package org.camunda.bpm.extension.process_test_coverage.examples

import org.camunda.bpm.engine.ProcessEngineConfiguration
import org.camunda.bpm.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration
import org.camunda.bpm.engine.runtime.ProcessInstance
import org.camunda.bpm.engine.test.Deployment
import org.camunda.bpm.engine.test.assertions.bpmn.BpmnAwareTests.assertThat
import org.camunda.bpm.engine.test.assertions.bpmn.BpmnAwareTests.complete
import org.camunda.bpm.engine.test.assertions.bpmn.BpmnAwareTests.runtimeService
import org.camunda.bpm.engine.test.assertions.bpmn.BpmnAwareTests.task
import org.camunda.bpm.engine.test.assertions.bpmn.BpmnAwareTests.withVariables
import org.camunda.bpm.extension.process_test_coverage.junit5.ProcessEngineCoverageExtension
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.junit.jupiter.api.extension.RegisterExtension

@Deployment(resources = ["order-process.bpmn"])
internal class OrderProcessKotlinTest {

    @JvmField
    @RegisterExtension
    val extension = ProcessEngineCoverageExtension.builder().build()


    @Test
    fun shouldExecuteHappyPath() {
        val instance = startProcess()
        assertThat(instance).isWaitingAt("Task_ProcessOrder")
        complete(
            task(),
            withVariables("orderOk", true)
        )
        assertThat(instance).isWaitingAt("Task_DeliverOrder")
        complete(task())
        assertThat(instance)
            .hasPassed("Event_OrderProcessed")
            .isEnded
    }

    @Test
    fun shouldCancelOrder() {
        val instance = startProcess()
        assertThat(instance).isWaitingAt("Task_ProcessOrder")
        complete(
            task(),
            withVariables("orderOk", false)
        )
        assertThat(instance)
            .hasPassed("Event_OrderCancelled")
            .isEnded
    }


    private fun startProcess(): ProcessInstance {
        return runtimeService().startProcessInstanceByKey("order-process")
    }

}

The problem also occurs with a java test class like the examples/junit5/src/test/java/org/camunda/bpm/extension/process_test_coverage/examples/OrderProcessTest.java

.
.
.
import static org.camunda.bpm.engine.test.assertions.bpmn.BpmnAwareTests.*;

@Deployment(resources = "order-process.bpmn")
public class OrderProcessTest {

    @RegisterExtension
    ProcessEngineCoverageExtension extension = ProcessEngineCoverageExtension.builder().build();
.
.
.
}

I found a workaround for kotlin code:

object MyProcessEngineCoverageExtensionObject {
    val extension = ProcessEngineCoverageExtension.builder().build()
}

@Deployment(resources = ["order-process.bpmn"])
internal class OrderProcessKotlinTest {

    @JvmField
    @RegisterExtension
    val extension = MyProcessEngineCoverageExtensionObject.extension

.
.
.
}

The workaround works also in JAVA

class ProcessEngineCoverageExtensionObject {
    public static ProcessEngineCoverageExtension extension = ProcessEngineCoverageExtension.builder().build();
}

@Deployment(resources = "order-process.bpmn")
public class OrderProcessTest {

    @RegisterExtension
    public ProcessEngineCoverageExtension extension = ProcessEngineCoverageExtensionObject.extension;
    
.
.
.
}

So if the bug can't be fixed, maybe you can enhance the example in the readme how to use the RegisterExtension

Will provide a fix for this bug.
Actually the better way to register the extension is, to do it on a static field.
Otherwise the class coverage will not be triggered and no coverage report generated.
In the PR for the bugfix I will add this information in the documentation.

@rohwerj thank you for the patch, I merged your PR in and the SNAPSHOT is now available in Sonatype OSS...

@arolfes could you please verify if the problem is also solved for your scenario?

Hi, thank you for the Patch, i will have a look on it on monday

The changes are working fine. Thank you