package org.camunda.bpm.extension.osgi.blueprint; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import org.camunda.bpm.engine.ProcessEngine; import org.camunda.bpm.engine.ProcessEngineConfiguration; import org.camunda.bpm.extension.osgi.classloading.BundleDelegatingClassLoader; import org.camunda.bpm.extension.osgi.classloading.ClassLoaderWrapper; import org.camunda.bpm.extension.osgi.engine.ProcessEngineFactory; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.osgi.framework.Bundle; public class ProcessEngineFactoryTest { private ProcessEngineFactory factory; @Before public void setUp() { factory = new ProcessEngineFactory(); } @Test public void initProcessEngine() throws Exception { // create mocks Bundle bundle = mock(Bundle.class); ProcessEngineConfiguration configuration = mock(ProcessEngineConfiguration.class); ProcessEngine engine = mock(ProcessEngine.class); // mock behaviour when(configuration.buildProcessEngine()).thenReturn(engine); ArgumentCaptor<ClassLoader> classLoaderCaptor = ArgumentCaptor .forClass(ClassLoader.class); // call methods factory.setBundle(bundle); factory.setProcessEngineConfiguration(configuration); factory.init(); // checks verify(configuration).setClassLoader(classLoaderCaptor.capture()); assertThat(classLoaderCaptor.getValue(), is(instanceOf(BundleDelegatingClassLoader.class))); BundleDelegatingClassLoader bundleDelCl = (BundleDelegatingClassLoader) classLoaderCaptor .getValue(); assertThat(bundleDelCl.getBundle(), is(bundle)); verify(configuration).buildProcessEngine(); assertThat(Thread.currentThread().getContextClassLoader(), is(not(instanceOf(ClassLoaderWrapper.class)))); assertThat(factory.getObject(), is(engine)); assertThat(factory.getBundle(), is(bundle)); assertThat(factory.getProcessEngineConfiguration(), is(configuration)); factory.destroy(); verify(engine).close(); } @Test public void destroyWithoutEngineDoesntCauseException() throws Exception { factory.destroy(); } }