<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Asynchronous User Task and Mocks in Alfresco Archive</title>
    <link>https://connect.hyland.com/t5/alfresco-archive/asynchronous-user-task-and-mocks/m-p/232252#M185382</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Thanks, Tijs.&amp;nbsp; I ended up just creating a few classes to override org.activiti.engine.test.mock.Mocks so that it is not using a ThreadLocal object.&amp;nbsp; This made the mocks global to the JVM through a static instance of a map.&amp;nbsp; Not the most elegant solution, but it has worked perfectly.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Created the class &amp;lt;b&amp;gt; MocksGlobal: &amp;lt;/b&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;public class MocksGlobal extends Mocks {&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; private static Map&amp;lt;String, Object&amp;gt; mockContainer = new HashMap&amp;lt;String, Object&amp;gt;();&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; @SuppressWarnings("unused")&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; private static Map&amp;lt;String, Object&amp;gt; getMocks() {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; Map&amp;lt;String, Object&amp;gt; mocks = mockContainer;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; if (mocks == null) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; mockContainer = new HashMap&amp;lt;String, Object&amp;gt;();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; return mocks;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; /**&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; * This method lets you register a mock object. Make sure to register the&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; * {@link MockExpressionManager} with your process engine configuration.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; * &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; * @param key&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the key under which the mock object will be registered&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; * @param value&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the mock object&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; public static void register(String key, Object value) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; getMocks().put(key, value);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; /**&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; * This method returns the mock object registered under the provided key or&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; * null if there is no object for the provided key.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; * &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; * @param key&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the key of the requested object&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; * @return the mock object registered under the provided key or null if&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; there is no object for the provided key&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; public static Object get(Object key) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; return getMocks().get(key);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; /**&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; * This method resets the internal map of mock objects.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; public static void reset() {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; if (getMocks() != null) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; getMocks().clear();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Created a new class, &amp;lt;b&amp;gt;MockGlobalExpressionManager&amp;lt;/b&amp;gt;.&amp;nbsp; This uses another new class, &amp;lt;b&amp;gt;MockElGlobalResolver&amp;lt;/b&amp;gt; which is shown further down:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;public class MockGlobalExpressionManager extends ExpressionManager {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; @Override&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; protected ELResolver createElResolver(VariableScope variableScope) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CompositeELResolver compositeElResolver = new CompositeELResolver();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compositeElResolver.add(new VariableScopeElResolver(variableScope));&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compositeElResolver.add(new MockElGlobalResolver());&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compositeElResolver.add(new ArrayELResolver());&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compositeElResolver.add(new ListELResolver());&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compositeElResolver.add(new MapELResolver());&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compositeElResolver.add(new BeanELResolver());&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return compositeElResolver;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The &amp;lt;b&amp;gt;MockElGlobalResolver&amp;lt;/b&amp;gt; class that uses the new &amp;lt;b&amp;gt;MocksGlobal&amp;lt;/b&amp;gt; class to resolve mocks:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;public class MockElGlobalResolver extends MockElResolver {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; @Override&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; public Object getValue(ELContext context, Object base, Object property) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Object bean = MocksGlobal.get(property);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (bean != null) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.setPropertyResolved(true);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return bean;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Finally, in our unit test class, we now register &amp;lt;b&amp;gt;MockGlobalExpressionManager&amp;lt;/b&amp;gt; instead of the Activiti MockExpressionManager:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;@Before&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;public void setup() throws Exception {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; MockitoAnnotations.initMocks(this);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; SpringProcessEngineConfiguration configuration = (SpringProcessEngineConfiguration) processEngine.getProcessEngineConfiguration();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; configuration.setExpressionManager(new MockGlobalExpressionManager());&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Then in our test, we use the &amp;lt;b&amp;gt;MocksGlobal&amp;lt;/b&amp;gt; class to register the mocks:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;@Test&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;public void testWithMock() throws Exception {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; System.out.println("================= testWithMock() start =================");&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; MocksGlobal.register("testMockDelegate", testMockDelegateMock);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; MocksGlobal.register("testMockListener", testMockListenerMock);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; when(testMockDelegateMock.execute((DelegateExecution) anyObject())).thenReturn("mock execute() was used");&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; ProcessInstance pi = runtimeService.startProcessInstanceByKey("testMockProcess");&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; assertNotNull(pi);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; JobTestHelper.waitForJobExecutorToProcessAllJobs(processEngine.getProcessEngineConfiguration(), managementService, 180000L, 100L);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; verify(testMockDelegateMock, times(1)).execute((DelegateExecution) anyObject());&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; verify(testMockListenerMock, times(1)).execute((ActivityExecution) anyObject());&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; verify(testMockListenerMock, times(1)).notify((DelegateTask) anyObject());&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; verifyNoMoreInteractions(testMockDelegateMock);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; verifyNoMoreInteractions(testMockListenerMock);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; System.out.println("================= testWithMock() end&amp;nbsp; ================= \n");&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 08 Sep 2016 11:39:08 GMT</pubDate>
    <dc:creator>jwglista</dc:creator>
    <dc:date>2016-09-08T11:39:08Z</dc:date>
    <item>
      <title>Asynchronous User Task and Mocks</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/asynchronous-user-task-and-mocks/m-p/232249#M185379</link>
      <description>Hello,I've had success using the MockExpressionManager to mock delegate methods for Service Tasks, as well as task listeners.&amp;nbsp; I have a user task that is asynchronous, and I am attempting to mock a listener method on this user task for the create event.&amp;nbsp; From my understanding, this requires the use</description>
      <pubDate>Wed, 07 Sep 2016 12:25:41 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/asynchronous-user-task-and-mocks/m-p/232249#M185379</guid>
      <dc:creator>jwglista</dc:creator>
      <dc:date>2016-09-07T12:25:41Z</dc:date>
    </item>
    <item>
      <title>Re: Asynchronous User Task and Mocks</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/asynchronous-user-task-and-mocks/m-p/232250#M185380</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Ok I'll give everyone a clue.&amp;nbsp; It looks like the org.activiti.engine.test.mock.Mocks class is using ThreadLocal to store the Map of mocks.&amp;nbsp; This will not work with async user tasks, since the process for those would be starting in a separate thread.&amp;nbsp; Not sure if this will require a change in the Activiti code going forward, or if there is a way I can get around this.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;public class Mocks {&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; private static ThreadLocal&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt; mockContainer = new ThreadLocal&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt;();&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; private static Map&amp;lt;String, Object&amp;gt; getMocks() {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Map&amp;lt;String, Object&amp;gt; mocks = mockContainer.get();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (mocks == null) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mocks = new HashMap&amp;lt;String, Object&amp;gt;();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mocks.mockContainer.set(mocks);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return mocks;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 07 Sep 2016 17:14:32 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/asynchronous-user-task-and-mocks/m-p/232250#M185380</guid>
      <dc:creator>jwglista</dc:creator>
      <dc:date>2016-09-07T17:14:32Z</dc:date>
    </item>
    <item>
      <title>Re: Asynchronous User Task and Mocks</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/asynchronous-user-task-and-mocks/m-p/232251#M185381</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;The mock implementation isn't yet suitable for asynchronous service tasks. So that will need some changes to the mock classes.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Best regards,&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 08 Sep 2016 07:13:24 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/asynchronous-user-task-and-mocks/m-p/232251#M185381</guid>
      <dc:creator>trademak</dc:creator>
      <dc:date>2016-09-08T07:13:24Z</dc:date>
    </item>
    <item>
      <title>Re: Asynchronous User Task and Mocks</title>
      <link>https://connect.hyland.com/t5/alfresco-archive/asynchronous-user-task-and-mocks/m-p/232252#M185382</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Thanks, Tijs.&amp;nbsp; I ended up just creating a few classes to override org.activiti.engine.test.mock.Mocks so that it is not using a ThreadLocal object.&amp;nbsp; This made the mocks global to the JVM through a static instance of a map.&amp;nbsp; Not the most elegant solution, but it has worked perfectly.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Created the class &amp;lt;b&amp;gt; MocksGlobal: &amp;lt;/b&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;public class MocksGlobal extends Mocks {&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; private static Map&amp;lt;String, Object&amp;gt; mockContainer = new HashMap&amp;lt;String, Object&amp;gt;();&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; @SuppressWarnings("unused")&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; private static Map&amp;lt;String, Object&amp;gt; getMocks() {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; Map&amp;lt;String, Object&amp;gt; mocks = mockContainer;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; if (mocks == null) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; mockContainer = new HashMap&amp;lt;String, Object&amp;gt;();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; return mocks;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; /**&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; * This method lets you register a mock object. Make sure to register the&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; * {@link MockExpressionManager} with your process engine configuration.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; * &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; * @param key&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the key under which the mock object will be registered&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; * @param value&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the mock object&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; public static void register(String key, Object value) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; getMocks().put(key, value);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; /**&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; * This method returns the mock object registered under the provided key or&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; * null if there is no object for the provided key.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; * &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; * @param key&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the key of the requested object&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; * @return the mock object registered under the provided key or null if&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; there is no object for the provided key&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; public static Object get(Object key) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; return getMocks().get(key);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; /**&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; * This method resets the internal map of mock objects.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; public static void reset() {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; if (getMocks() != null) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; getMocks().clear();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Created a new class, &amp;lt;b&amp;gt;MockGlobalExpressionManager&amp;lt;/b&amp;gt;.&amp;nbsp; This uses another new class, &amp;lt;b&amp;gt;MockElGlobalResolver&amp;lt;/b&amp;gt; which is shown further down:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;public class MockGlobalExpressionManager extends ExpressionManager {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; @Override&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; protected ELResolver createElResolver(VariableScope variableScope) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CompositeELResolver compositeElResolver = new CompositeELResolver();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compositeElResolver.add(new VariableScopeElResolver(variableScope));&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compositeElResolver.add(new MockElGlobalResolver());&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compositeElResolver.add(new ArrayELResolver());&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compositeElResolver.add(new ListELResolver());&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compositeElResolver.add(new MapELResolver());&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compositeElResolver.add(new BeanELResolver());&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return compositeElResolver;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The &amp;lt;b&amp;gt;MockElGlobalResolver&amp;lt;/b&amp;gt; class that uses the new &amp;lt;b&amp;gt;MocksGlobal&amp;lt;/b&amp;gt; class to resolve mocks:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;public class MockElGlobalResolver extends MockElResolver {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; @Override&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; public Object getValue(ELContext context, Object base, Object property) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Object bean = MocksGlobal.get(property);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (bean != null) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.setPropertyResolved(true);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return bean;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Finally, in our unit test class, we now register &amp;lt;b&amp;gt;MockGlobalExpressionManager&amp;lt;/b&amp;gt; instead of the Activiti MockExpressionManager:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;@Before&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;public void setup() throws Exception {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; MockitoAnnotations.initMocks(this);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; SpringProcessEngineConfiguration configuration = (SpringProcessEngineConfiguration) processEngine.getProcessEngineConfiguration();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; configuration.setExpressionManager(new MockGlobalExpressionManager());&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Then in our test, we use the &amp;lt;b&amp;gt;MocksGlobal&amp;lt;/b&amp;gt; class to register the mocks:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;code&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;@Test&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;public void testWithMock() throws Exception {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; System.out.println("================= testWithMock() start =================");&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; MocksGlobal.register("testMockDelegate", testMockDelegateMock);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; MocksGlobal.register("testMockListener", testMockListenerMock);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; when(testMockDelegateMock.execute((DelegateExecution) anyObject())).thenReturn("mock execute() was used");&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; ProcessInstance pi = runtimeService.startProcessInstanceByKey("testMockProcess");&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; assertNotNull(pi);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; JobTestHelper.waitForJobExecutorToProcessAllJobs(processEngine.getProcessEngineConfiguration(), managementService, 180000L, 100L);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; verify(testMockDelegateMock, times(1)).execute((DelegateExecution) anyObject());&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; verify(testMockListenerMock, times(1)).execute((ActivityExecution) anyObject());&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; verify(testMockListenerMock, times(1)).notify((DelegateTask) anyObject());&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; verifyNoMoreInteractions(testMockDelegateMock);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; verifyNoMoreInteractions(testMockListenerMock);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; System.out.println("================= testWithMock() end&amp;nbsp; ================= \n");&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;lt;/code&amp;gt;&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 08 Sep 2016 11:39:08 GMT</pubDate>
      <guid>https://connect.hyland.com/t5/alfresco-archive/asynchronous-user-task-and-mocks/m-p/232252#M185382</guid>
      <dc:creator>jwglista</dc:creator>
      <dc:date>2016-09-08T11:39:08Z</dc:date>
    </item>
  </channel>
</rss>

