You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2017/12/15 18:27:47 UTC

[03/17] isis-site git commit: ISIS-1465: tiny doc fix

http://git-wip-us.apache.org/repos/asf/isis-site/blob/a1b07ded/content/guides/ugtst/ugtst.html
----------------------------------------------------------------------
diff --git a/content/guides/ugtst/ugtst.html b/content/guides/ugtst/ugtst.html
index 40c79cd..3ca3cdf 100644
--- a/content/guides/ugtst/ugtst.html
+++ b/content/guides/ugtst/ugtst.html
@@ -1355,9 +1355,34 @@ CustomerRepository customers;</code></pre>
           <p>The example code in this section is taken from the app generated by the <a href="../ugfun/ugfun.html#_ugfun_getting-started_simpleapp-archetype">SimpleApp archetype</a>.</p> 
          </div> 
          <div class="sect3"> 
-          <h4 id="_1_15_0_onwards">4.2.1. 1.15.0 onwards</h4> 
+          <h4 id="_1_16_0_snapshot">4.2.1. 1.16.0-SNAPSHOT</h4> 
           <div class="paragraph"> 
-           <p>In <code>1.15.0</code> the bootstrapping is accomplished using a combination of <code>AppManifestAbstract</code> (a framework-provided implementation of <a href="../rgcms/rgcms.html#_rgcms_classes_AppManifest-bootstrapping"><code>AppManifest</code></a>) and <code>IntegrationTestAbstract2</code> superclass.</p> 
+           <p>In <code>1.16.0-SNAPSHOT</code> and later, the bootstrapping of integration tests is done using a <a href="../rgcms/rgcms.html#_rgcms_classes_AppManifest2-bootstrapping"><code>Module</code></a> implementation, along with the <code>IntegrationTestAbstract3</code> superclass.</p> 
+          </div> 
+          <div class="paragraph"> 
+           <p>For example, the <a href="../ugfun/ugfun.html#_ugfun_getting-started_simpleapp-archetype">SimpleApp archetype</a>'s integration tests all inherit from this class:</p> 
+          </div> 
+          <div class="listingblock"> 
+           <div class="content"> 
+            <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="directive">abstract</span> <span class="type">class</span> <span class="class">DomainAppIntegTestAbstract</span> <span class="directive">extends</span> IntegrationTestAbstract3 {
+
+    <span class="directive">public</span> DomainAppIntegTestAbstract() {
+        <span class="local-variable">super</span>(<span class="keyword">new</span> DomainAppApplicationModule());
+    }
+}</code></pre> 
+           </div> 
+          </div> 
+          <div class="paragraph"> 
+           <p>where <code>DomainAppApplicationModule</code> in turn declares all the dependencies that make up the application.</p> 
+          </div> 
+          <div class="paragraph"> 
+           <p>If required, the <code>Module</code> can be customised first using the various <code>withXxx(…​)</code> methods to specify addition modules, domain services and configuration properties.</p> 
+          </div> 
+         </div> 
+         <div class="sect3"> 
+          <h4 id="_1_15_0">4.2.2. 1.15.0</h4> 
+          <div class="paragraph"> 
+           <p>In <code>1.15.0</code> the bootstrapping of integration tests is done using a combination of <code>AppManifestAbstract</code> (a framework-provided implementation of <a href="../rgcms/rgcms.html#_rgcms_classes_AppManifest-bootstrapping"><code>AppManifest</code></a>) and <code>IntegrationTestAbstract2</code> superclass.</p> 
           </div> 
           <div class="paragraph"> 
            <p>For example, the <a href="../ugfun/ugfun.html#_ugfun_getting-started_simpleapp-archetype">SimpleApp archetype</a>'s integration tests all inherit from this class:</p> 
@@ -1370,7 +1395,6 @@ CustomerRepository customers;</code></pre>
     <span class="directive">public</span> <span class="directive">static</span> <span class="type">void</span> initSystem() {
         bootstrapUsing(<span class="keyword">new</span> DomainAppAppManifest());
     }
-
 }</code></pre> 
            </div> 
           </div> 
@@ -1405,7 +1429,7 @@ CustomerRepository customers;</code></pre>
           </div> 
          </div> 
          <div class="sect3"> 
-          <h4 id="_1_13_0">4.2.2. 1.13.0</h4> 
+          <h4 id="_1_13_0">4.2.3. 1.13.0</h4> 
           <div class="paragraph"> 
            <p>In <code>1.13.0</code> the bootstrapping itself is typically performed by a "system initializer" class. This is responsible for instantiating the Apache Isis runtime (based on a provided <code>AppManifest</code>) and binding it to a thread-local.</p> 
           </div> 
@@ -1482,7 +1506,7 @@ CustomerRepository customers;</code></pre>
           </div> 
          </div> 
          <div class="sect3"> 
-          <h4 id="_1_9_0">4.2.3. 1.9.0</h4> 
+          <h4 id="_1_9_0">4.2.4. 1.9.0</h4> 
           <div class="paragraph"> 
            <p>In <code>1.9.0</code> the <code>AppManifest</code> was introduced as mechanism to specify all parts (domain code, framework components, configuation properties) that make up a running application.</p> 
           </div> 
@@ -1533,7 +1557,7 @@ CustomerRepository customers;</code></pre>
           </div> 
          </div> 
          <div class="sect3"> 
-          <h4 id="_1_8_0_and_earlier">4.2.4. 1.8.0 and earlier</h4> 
+          <h4 id="_1_8_0_and_earlier">4.2.5. 1.8.0 and earlier</h4> 
           <div class="paragraph"> 
            <p>Prior to 1.9.0, the services and entities had to be specified in two separate locations. The suggested way to do this was to introduce a subclass of the <code>IsisSystemForTest.Builder</code> class:</p> 
           </div> 
@@ -1634,6 +1658,7 @@ CustomerRepository customers;</code></pre>
          </div> 
          <div class="ulist"> 
           <ul> 
+           <li> <p>as of (<code>1.16.0=SNAPSHOT</code>), use <code>IntegrationTestAbstract3</code></p> </li> 
            <li> <p>as of (<code>1.15.0</code>), use <code>IntegrationTestAbstract2</code></p> </li> 
            <li> <p>for earlier releases, use (its superclass) <code>IntegrationTestAbstract</code>.</p> </li> 
           </ul> 
@@ -1642,34 +1667,83 @@ CustomerRepository customers;</code></pre>
           <p>This base class <a href="#_ugtst_integ-test-support_bootstrapping">bootstraps</a> the framework (caching the framework on a thread-local), and provides various utility methods and framework-provided services for use by your application’s subclass tests.</p> 
          </div> 
          <div class="sect3"> 
-          <h4 id="__ugtst_integ-test-support_abstract-class_IntegrationTestAbstract2">4.3.1. <code>IntegrationTestAbstract2</code></h4> 
+          <h4 id="__ugtst_integ-test-support_abstract-class_IntegrationTestAbstract3">4.3.1. <code>IntegrationTestAbstract3</code> (<code>1.16.0-SNAPSHOT</code>)</h4> 
+          <div class="paragraph"> 
+           <p>(As of <code>1.16.0-SNAPSHOT</code>) we recommend that your integration tests inherit from Apache Isis' <code>IntegrationTestAbstract3</code> class. The primary benefit over <code>IntegrationTestAbstract2</code> (discussed <a href="#__ugtst_integ-test-support_abstract-class_IntegrationTestAbstract2">below</a> is that it allows the test to be bootstrapped by passing in a <code>Module</code> rather than an <code>AppManifest</code>.</p> 
+          </div> 
+          <div class="paragraph"> 
+           <p>For example:</p> 
+          </div> 
+          <div class="listingblock"> 
+           <div class="content"> 
+            <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="directive">abstract</span> <span class="type">class</span> <span class="class">DomainAppIntegTest</span>
+                        <span class="directive">extends</span> IntegrationTestAbstract3 {
+
+    <span class="directive">public</span> DomainAppIntegTestAbstract() {
+        <span class="local-variable">super</span>(<span class="keyword">new</span> DomainAppApplicationModule());
+    }
+}</code></pre> 
+           </div> 
+          </div> 
+          <div class="paragraph"> 
+           <p>However, the <code>IntegrationTestAbstract3</code> class also allows the module to be specified externally, using either the <code>isis.integTest.module</code> or the (more general) <code>isis.headless.module</code> system property, eg by updating the <code>pom.xml</code>.</p> 
+          </div> 
+          <div class="paragraph"> 
+           <p>For example:</p> 
+          </div> 
+          <div class="listingblock"> 
+           <div class="content"> 
+            <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;properties&gt;</span>
+    <span class="tag">&lt;isis.integTest.module&gt;</span>
+        org.estatio.module.application.EstatioApplicationModule
+    <span class="tag">&lt;/isis.integTest.module&gt;</span>
+<span class="tag">&lt;/properties&gt;</span></code></pre> 
+           </div> 
+          </div> 
+          <div class="paragraph"> 
+           <p>This is required when the codebase is organised as multiple "logical" modules within a single Maven "physical" module (ie <code>src/main/java</code> compilation unit). The integration testing framework will bootstrap the module specified by the system property and cache for all tests discovered within the physical module.</p> 
+          </div> 
+         </div> 
+         <div class="sect3"> 
+          <h4 id="__ugtst_integ-test-support_abstract-class_IntegrationTestAbstract2">4.3.2. <code>IntegrationTestAbstract2</code></h4> 
           <div class="paragraph"> 
            <p>(As of <code>1.15.0</code>) we recommend that your integration tests inherit from Apache Isis' <code>IntegrationTestAbstract2</code> class:</p> 
           </div> 
           <div class="listingblock"> 
            <div class="content"> 
-            <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="directive">abstract</span> <span class="type">class</span> <span class="class">DomainAppIntegTest</span> <span class="directive">extends</span> IntegrationTestAbstract2 {
+            <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="directive">abstract</span> <span class="type">class</span> <span class="class">DomainAppIntegTest</span>
+    <span class="directive">extends</span> IntegrationTestAbstract2 {
     ...
 }</code></pre> 
            </div> 
           </div> 
           <div class="paragraph"> 
-           <p>Although not mandatory, this provides a number of helper/convenience methods and JUnit rules:</p> 
+           <p>Bootstrapping is performed by calling either of the overloaded <em>static</em> <code>bootstrapUsing(…​)</code> methods:</p> 
           </div> 
           <div class="listingblock"> 
            <div class="content"> 
-            <pre class="CodeRay highlight"><code data-lang="java">    <span class="annotation">@Rule</span>
-    <span class="directive">public</span> IsisTransactionRule isisTransactionRule =                         <i class="conum" data-value="1"></i><b>(1)</b>
-        <span class="keyword">new</span> IsisTransactionRule();
-    <span class="annotation">@Rule</span>
-    <span class="directive">public</span> JUnitRuleMockery2 context =                                       <i class="conum" data-value="2"></i><b>(2)</b>
-        JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
-    <span class="annotation">@Rule</span>
-    <span class="directive">public</span> ExpectedException expectedExceptions =                            <i class="conum" data-value="3"></i><b>(3)</b>
-        ExpectedException.none();
-    <span class="annotation">@Rule</span>
-    <span class="directive">public</span> ExceptionRecognizerTranslate exceptionRecognizerTranslations =    <i class="conum" data-value="4"></i><b>(4)</b>
-        ExceptionRecognizerTranslate.create();</code></pre> 
+            <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">protected</span> <span class="directive">static</span> <span class="type">void</span> bootstrapUsing(<span class="directive">final</span> AppManifestAbstract.Builder builder) { ... }
+
+<span class="directive">protected</span> <span class="directive">static</span> <span class="type">void</span> bootstrapUsing(<span class="directive">final</span> AppManifest appManifest) { ... }</code></pre> 
+           </div> 
+          </div> 
+          <div class="paragraph"> 
+           <p>Although not mandatory, this test class also provides a number of helper/convenience methods and JUnit rules:</p> 
+          </div> 
+          <div class="listingblock"> 
+           <div class="content"> 
+            <pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@Rule</span>
+<span class="directive">public</span> IsisTransactionRule isisTransactionRule =                         <i class="conum" data-value="1"></i><b>(1)</b>
+    <span class="keyword">new</span> IsisTransactionRule();
+<span class="annotation">@Rule</span>
+<span class="directive">public</span> JUnitRuleMockery2 context =                                       <i class="conum" data-value="2"></i><b>(2)</b>
+    JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
+<span class="annotation">@Rule</span>
+<span class="directive">public</span> ExpectedException expectedExceptions =                            <i class="conum" data-value="3"></i><b>(3)</b>
+    ExpectedException.none();
+<span class="annotation">@Rule</span>
+<span class="directive">public</span> ExceptionRecognizerTranslate exceptionRecognizerTranslations =    <i class="conum" data-value="4"></i><b>(4)</b>
+    ExceptionRecognizerTranslate.create();</code></pre> 
            </div> 
           </div> 
           <div class="colist arabic"> 
@@ -1698,30 +1772,11 @@ CustomerRepository customers;</code></pre>
            <p>All of these rules could be inlined in your own base class; as we say, they are a convenience.</p> 
           </div> 
           <div class="paragraph"> 
-           <p>The <code>IntegrationTestAbstract2</code> also provides a number of helper/convenience methods, though most of these have been deprecated because the functionality they expose is now readily accessible through various domain services; most notably these are:</p> 
-          </div> 
-          <div class="ulist"> 
-           <ul> 
-            <li> <p><a href="../rgsvc/rgsvc.html#_rgsvc_persistence-layer-api_RepositoryService"><code>RepositoryService</code></a></p> </li> 
-            <li> <p><a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_FactoryService"><code>FactoryService</code></a></p> </li> 
-            <li> <p><a href="../rgsvc/rgsvc.html#_rgsvc_metadata-api_ServiceRegistry"><code>ServiceRegistry2</code></a></p> </li> 
-            <li> <p><a href="../rgsvc/rgsvc.html#_rgsvc_application-layer-api_WrapperFactory"><code>WrapperFactory</code></a><br></p> 
-             <div class="paragraph"> 
-              <p>to wrap objects simulating interaction through the user interface)</p> 
-             </div> </li> 
-            <li> <p><a href="../rgsvc/rgsvc.html#_rgsvc_application-layer-api_TransactionService"><code>TransactionService</code></a><br></p> 
-             <div class="paragraph"> 
-              <p>most commonly used to commit changes after the fixture setup) and,</p> 
-             </div> </li> 
-            <li> <p><a href="../rgsvc/rgsvc.html#_rgsvc_application-layer-api_SessionManagementService"><code>SessionManagementService</code></a><br></p> 
-             <div class="paragraph"> 
-              <p>for tests that check interactions over multiple separate sessions.</p> 
-             </div> </li> 
-           </ul> 
+           <p>The <code>IntegrationTestAbstract2</code> also provides a number of helper/convenience methods, though most of these have been deprecated because the functionality they expose is now readily accessible through various domain services; most notably these are <a href="../rgsvc/rgsvc.html#_rgsvc_persistence-layer-api_RepositoryService"><code>RepositoryService</code></a>, <a href="../rgsvc/rgsvc.html#_rgsvc_core-domain-api_FactoryService"><code>FactoryService</code></a>, <a href="../rgsvc/rgsvc.html#_rgsvc_metadata-api_ServiceRegistry"><code>ServiceRegistry2</code></a>, <a href="../rgsvc/rgsvc.html#_rgsvc_application-layer-api_WrapperFactory"><code>WrapperFactory</code></a> (to wrap objects simulating interaction through the user interface), <a href="../rgsvc/rgsvc.html#_rgsvc_application-layer-api_TransactionService"><code>TransactionService</code></a> (most commonly used to commit changes after the fixture setup) and <a href="../rgsvc/rgsvc.html#_rgsvc_application-layer-
 api_SessionManagementService"><code>SessionManagementService</code></a> (for tests that check interactions over multiple separate sessions).</p> 
           </div> 
          </div> 
          <div class="sect3"> 
-          <h4 id="__ugtst_integ-test-support_abstract-class_IntegrationTestAbstract">4.3.2. <code>IntegrationTestAbstract</code></h4> 
+          <h4 id="__ugtst_integ-test-support_abstract-class_IntegrationTestAbstract">4.3.3. <code>IntegrationTestAbstract</code></h4> 
           <div class="paragraph"> 
            <p>For earlier releases we recommend that your base class inherit from Apache Isis' <code>IntegrationTestAbstract</code> class:</p> 
           </div> 
@@ -2339,289 +2394,227 @@ Customer customer = (Customer)((WrappingObject)wrappedCustomer).__isis_wrapped()
          <div class="paragraph"> 
           <p>The code that goes in step definitions is broadly the same as the code that goes in an integration test method. One benefit of using step definitions (rather than integration tests) is that the step definitions are reusable across scenarios, so there may be less code overall to maintain. For example, if you have a step definition that maps to "given an uncompleted todo item", then this can be used for all the scenarios that start with that as their precondition.</p> 
          </div> 
-        </div> 
-        <div class="sect2"> 
-         <h3 id="_ugtst_bdd-spec-support_key-classes">5.2. Key classes</h3>
-         <div class="btn-group" style="float: right; font-size: small; padding: 6px; margin-top: -55px; ">
-          <button type="button" class="btn btn-xs btn-default" onclick="window.location.href=&quot;https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_bdd-spec-support_key-classes.adoc&quot;"><i class="fa fa-pencil-square-o"></i>&nbsp;Edit</button>
-          <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span class="caret"></span><span class="sr-only">Toggle Dropdown</span></button>
-          <ul class="dropdown-menu">
-           <li><a href="https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_bdd-spec-support_key-classes.adoc" target="_blank"><i class="fa fa-pencil-square-o fa-fw" aria-hidden="true"></i>&nbsp; Edit</a></li>
-           <li><a href="https://github.com/apache/isis/commits/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_bdd-spec-support_key-classes.adoc" target="_blank"><i class="fa fa-clock-o fa-fw" aria-hidden="true"></i>&nbsp; History</a></li>
-           <li><a href="https://github.com/apache/isis/raw/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_bdd-spec-support_key-classes.adoc" target="_blank"><i class="fa fa-file-text-o fa-fw" aria-hidden="true"></i>&nbsp; Raw</a></li>
-           <li><a href="https://github.com/apache/isis/blame/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_bdd-spec-support_key-classes.adoc" target="_blank"><i class="fa fa-hand-o-right fa-fw" aria-hidden="true"></i>&nbsp; Blame</a></li>
-          </ul>
-         </div> 
          <div class="paragraph"> 
-          <p>There are some key framework classes that make up the spec support; these are discussed below.</p> 
-         </div> 
-         <div class="admonitionblock note"> 
-          <table> 
-           <tbody>
-            <tr> 
-             <td class="icon"> <i class="fa icon-note" title="Note"></i> </td> 
-             <td class="content"> some of these are also used by Apache Isis' <a href="../ugtst/ugtst.html#_ugtst_integ-test-support">Integration Test support</a>. </td> 
-            </tr> 
-           </tbody>
-          </table> 
-         </div> 
-         <div class="sect3"> 
-          <h4 id="__code_isissystemfortest_code">5.2.1. <code>IsisSystemForTest</code></h4> 
-          <div class="paragraph"> 
-           <p>The <code>IsisSystemForTest</code> class allows a complete running instance of Apache Isis to be bootstrapped (with the JDO objectstore); this is then held on a a <code>ThreadLocal</code> from one test to another.</p> 
-          </div> 
-          <div class="paragraph"> 
-           <p>Typically bootstrapping code is used to lazily instantiate the <code>IsisSystemForTest</code> once and once only. The mechanism for doing this is line-for-line identical in both BDD step defs and integration tests.</p> 
-          </div> 
-         </div> 
-         <div class="sect3"> 
-          <h4 id="__code_scenarioexecution_code">5.2.2. <code>ScenarioExecution</code></h4> 
-          <div class="paragraph"> 
-           <p>The <code>ScenarioExecution</code> provides a context for a scenario that is being executed. It is Cucumber that determines which step definitions are run, and in which order, and so state cannot be passed between step definitions using local variables or instance variables. Instead the <code>ScenarioExecution</code> acts like a hashmap, allowing each step to put data (eg "given an uncompleted todoitem") into the map or get data ("when I complete the todoitem") from the map. This is done using the <code>putVar(…​)</code> and <code>getVar(…​)</code> methods.</p> 
-          </div> 
-          <div class="admonitionblock tip"> 
-           <table> 
-            <tbody>
-             <tr> 
-              <td class="icon"> <i class="fa icon-tip" title="Tip"></i> </td> 
-              <td class="content"> 
-               <div class="paragraph"> 
-                <p>This corresponds broadly to the "World" object in Ruby-flavoured Cucumber.</p> 
-               </div> </td> 
-             </tr> 
-            </tbody>
-           </table> 
-          </div> 
-          <div class="paragraph"> 
-           <p>The <code>ScenarioExecution</code> also provids access to the configured domain services (using the <code>service(…​)</code> method) and the <code>DomainObjectContainer</code> (through the <code>container()</code> method).</p> 
-          </div> 
-          <div class="admonitionblock note"> 
-           <table> 
-            <tbody>
-             <tr> 
-              <td class="icon"> <i class="fa icon-note" title="Note"></i> </td> 
-              <td class="content"> 
-               <div class="paragraph"> 
-                <p>This could probably be refactored; Cucumber JVM provides automatic dependency injection into setp definitions, but Apache Isis does not currently leverage or exploit this capability.</p> 
-               </div> </td> 
-             </tr> 
-            </tbody>
-           </table> 
-          </div> 
-          <div class="paragraph"> 
-           <p>Like the <code>IsisSystemForTest</code> class, the <code>ScenarioExecution</code> class binds an instance of itself onto a <code>ThreadLocal</code>. It can then be accessed in BDD step definitions using <code>ScenarioExecution.current()</code> static method.</p> 
-          </div> 
-         </div> 
-         <div class="sect3"> 
-          <h4 id="__code_wrapperfactory_code">5.2.3. <code>WrapperFactory</code></h4> 
-          <div class="paragraph"> 
-           <p>As with integration tests, the UI can be simulated by "wrapping" each domain object in a proxy using the <code>WrapperFactory</code>.</p> 
-          </div> 
-         </div> 
-         <div class="sect3"> 
-          <h4 id="__code_cukeglueabstract_code">5.2.4. <code>CukeGlueAbstract</code></h4> 
-          <div class="paragraph"> 
-           <p>The <code>CukeGlueAbstract</code> acts as a convenience superclass for writing BDD step definitions (analogous to the <code>IntegrationTestAbstract</code> for integation tests). Underneath the covers it delegates to an underlying <code>ScenarioExecution</code>.</p> 
-          </div> 
+          <p>Unresolved directive in _ugtst_bdd-spec-support.adoc - include::_ugtst_bdd-spec-support_key-classes.adoc[leveloffset=+1] :leveloffset: +1</p> 
          </div> 
         </div> 
-        <div class="sect2"> 
-         <h3 id="_ugtst_bdd-spec-support_writing-a-bdd-spec">5.3. Writing a BDD spec</h3>
-         <div class="btn-group" style="float: right; font-size: small; padding: 6px; margin-top: -55px; ">
-          <button type="button" class="btn btn-xs btn-default" onclick="window.location.href=&quot;https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_bdd-spec-support_writing-a-bdd-spec.adoc&quot;"><i class="fa fa-pencil-square-o"></i>&nbsp;Edit</button>
-          <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span class="caret"></span><span class="sr-only">Toggle Dropdown</span></button>
-          <ul class="dropdown-menu">
-           <li><a href="https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_bdd-spec-support_writing-a-bdd-spec.adoc" target="_blank"><i class="fa fa-pencil-square-o fa-fw" aria-hidden="true"></i>&nbsp; Edit</a></li>
-           <li><a href="https://github.com/apache/isis/commits/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_bdd-spec-support_writing-a-bdd-spec.adoc" target="_blank"><i class="fa fa-clock-o fa-fw" aria-hidden="true"></i>&nbsp; History</a></li>
-           <li><a href="https://github.com/apache/isis/raw/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_bdd-spec-support_writing-a-bdd-spec.adoc" target="_blank"><i class="fa fa-file-text-o fa-fw" aria-hidden="true"></i>&nbsp; Raw</a></li>
-           <li><a href="https://github.com/apache/isis/blame/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_bdd-spec-support_writing-a-bdd-spec.adoc" target="_blank"><i class="fa fa-hand-o-right fa-fw" aria-hidden="true"></i>&nbsp; Blame</a></li>
-          </ul>
-         </div> 
-         <div class="paragraph"> 
-          <p>BDD specifications contain:</p> 
-         </div> 
-         <div class="ulist"> 
-          <ul> 
-           <li> <p>a <code>XxxSpec.feature</code> file, describing the feature and the scenarios (given/when/then)s that constitute its acceptance criteria</p> </li> 
-           <li> <p>a <code>RunSpecs.java</code> class file to run the specification (all boilerplate). This will run all <code>.feature</code> files in the same package or subpackages.</p> </li> 
-           <li> <p>one or several <code>XxxGlue</code> constituting the step definitions to be matched against.<br></p> 
-            <div class="paragraph"> 
-             <p>The "glue" (step definitions) are intended to be reused across features. We therefore recommend that they reside in a separate package, and are organized by the entity type upon which they act.<br></p> 
-            </div> 
-            <div class="paragraph"> 
-             <p>For example, given a feature that involves <code>Customer</code> and <code>Order</code>, have the step definitions pertaining to <code>Customer</code> reside in <code>CustomerGlue</code>, and the step definitions pertaining to <code>Order</code> reside in <code>OrderGlue</code>.<br></p> 
-            </div> 
-            <div class="paragraph"> 
-             <p>The <code>glue</code> attribute of the Cucumber-JVM JUnit runner eallows you to indicate which package(s) should be recursively searched to find any glue.</p> 
-            </div> </li> 
-           <li> <p>a system initializer class. You can reuse the system initializer from any integration tests (as described in <a href="../ugtst/ugtst.html#_ugtst_integ-test-support">Integration Test Support</a>, bootstrapping section).</p> </li> 
-          </ul> 
-         </div> 
-         <div class="paragraph"> 
-          <p>Here’s an example of a feature from the <a href="../ugfun/ugfun.html#_ugfun_getting-started_simpleapp-archetype">SimpleApp archetype</a>:</p> 
-         </div> 
-         <div class="listingblock"> 
-          <div class="content"> 
-           <pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@SimpleObjectsFixture</span>
+       </div> 
+      </div> 
+      <div class="sect1"> 
+       <h2 id="_ugtst_bdd-spec-support_writing-a-bdd-spec">6. Writing a BDD spec (<code>1.16.0-SNAPSHOT</code>)</h2>
+       <div class="btn-group" style="float: right; font-size: small; padding: 6px; margin-top: -55px; ">
+        <button type="button" class="btn btn-xs btn-default" onclick="window.location.href=&quot;https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_bdd-spec-support_writing-a-bdd-spec.adoc&quot;"><i class="fa fa-pencil-square-o"></i>&nbsp;Edit</button>
+        <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span class="caret"></span><span class="sr-only">Toggle Dropdown</span></button>
+        <ul class="dropdown-menu">
+         <li><a href="https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_bdd-spec-support_writing-a-bdd-spec.adoc" target="_blank"><i class="fa fa-pencil-square-o fa-fw" aria-hidden="true"></i>&nbsp; Edit</a></li>
+         <li><a href="https://github.com/apache/isis/commits/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_bdd-spec-support_writing-a-bdd-spec.adoc" target="_blank"><i class="fa fa-clock-o fa-fw" aria-hidden="true"></i>&nbsp; History</a></li>
+         <li><a href="https://github.com/apache/isis/raw/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_bdd-spec-support_writing-a-bdd-spec.adoc" target="_blank"><i class="fa fa-file-text-o fa-fw" aria-hidden="true"></i>&nbsp; Raw</a></li>
+         <li><a href="https://github.com/apache/isis/blame/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_bdd-spec-support_writing-a-bdd-spec.adoc" target="_blank"><i class="fa fa-hand-o-right fa-fw" aria-hidden="true"></i>&nbsp; Blame</a></li>
+        </ul>
+       </div> 
+       <div class="sectionbody"> 
+        <div class="paragraph"> 
+         <p>BDD specifications contain:</p> 
+        </div> 
+        <div class="ulist"> 
+         <ul> 
+          <li> <p>a <code>XxxSpec.feature</code> file, describing the feature and the scenarios (given/when/then)s that constitute its acceptance criteria</p> </li> 
+          <li> <p>a <code>RunSpecs.java</code> class file to run the specification (all boilerplate). This will run all <code>.feature</code> files in the same package or subpackages.</p> </li> 
+          <li> <p>one or several <code>XxxGlue</code> constituting the step definitions to be matched against.<br></p> 
+           <div class="paragraph"> 
+            <p>The "glue" (step definitions) are intended to be reused across features. We therefore recommend that they reside in a separate package, and are organized by the entity type upon which they act.<br></p> 
+           </div> 
+           <div class="paragraph"> 
+            <p>For example, given a feature that involves <code>Customer</code> and <code>Order</code>, have the step definitions pertaining to <code>Customer</code> reside in <code>CustomerGlue</code>, and the step definitions pertaining to <code>Order</code> reside in <code>OrderGlue</code>.<br></p> 
+           </div> 
+           <div class="paragraph"> 
+            <p>The <code>glue</code> attribute of the Cucumber-JVM JUnit runner allows you to indicate which package(s) should be recursively searched to find any glue.</p> 
+           </div> 
+           <div class="paragraph"> 
+            <p>There also needs to be one glue class that is used to bootstrap the runtime.</p> 
+           </div> </li> 
+         </ul> 
+        </div> 
+        <div class="paragraph"> 
+         <p>Here’s an example of a feature from the <a href="../ugfun/ugfun.html#_ugfun_getting-started_simpleapp-archetype">SimpleApp archetype</a>:</p> 
+        </div> 
+        <div class="listingblock"> 
+         <div class="content"> 
+          <pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@DomainAppDemo</span>
 Feature: <span class="predefined-type">List</span> and Create New Simple Objects
 
-  <span class="annotation">@integration</span>
   Scenario: Existing simple objects can be listed and <span class="keyword">new</span> ones created
-    Given there are initially <span class="integer">3</span> simple objects
+    Given there are initially <span class="integer">10</span> simple objects
     When  I create a <span class="keyword">new</span> simple object
-    Then  there are <span class="integer">4</span> simple objects</code></pre> 
-          </div> 
-         </div> 
-         <div class="paragraph"> 
-          <p>The <code>@SimpleObjectsFixture</code> is a custom tag we’ve specified to indicate the prerequisite fixtures to be loaded; more on this in a moment. The <code>@integration</code> tag, meanwhile, says that this feature should be run with integration-level scope.</p> 
+    Then  there are <span class="integer">11</span> simple objects</code></pre> 
          </div> 
-         <div class="admonitionblock note"> 
-          <table> 
-           <tbody>
-            <tr> 
-             <td class="icon"> <i class="fa icon-note" title="Note"></i> </td> 
-             <td class="content"> 
-              <div class="paragraph"> 
-               <p>Although BDD specs are most commonly used for end-to-end tests (ie at the same scope as an integration test), the two concerns (expressability of a test to a business person vs granularity of the test) should not be conflated. There are a couple of <a href="http://silkandspinach.net/2013/01/18/a-testing-strategy/">good</a> blog <a href="http://claysnow.co.uk/the-testing-iceberg/">posts</a> discussing <a href="http://claysnow.co.uk/living-documentation-can-be-readable-and-fast/">this</a>. The basic idea is to avoid the overhead of a heavy-duty integration test if possible.</p> 
-              </div> 
-              <div class="paragraph"> 
-               <p>Apache Isis does also support running BDD specs in unit test mode; by annotating the scenario with the <code>@unit</code> (rather than <code>@integration</code> tag). When running under unit-level scope, the Apache Isis system is <em>not</em> instantiated. Instead, the <code>ScenarioExecution</code> class returns JMock mocks (except for the <code>WrapperFactory</code>, if configured).</p> 
-              </div> 
-              <div class="paragraph"> 
-               <p>To support unit testing scope Apache Isis provides the <code>InMemoryDB</code> class; a glorified hashmap of "persisted" objects. Use of this utility class is optional.</p> 
-              </div> 
-              <div class="paragraph"> 
-               <p>Writing a BDD spec that supports both modes of operation therefore takes more effort and we expect most users interested in BDD will use integration-testing scope; for these reasons we have chosen <em>not</em> to include unit-testing support in the <a href="../ugfun/ugfun.html#_ugfun_getting-started_simpleapp-archetype">SimpleApp archetype</a>. For those who do require faster-executing test suite, it’s worthwhile knowing that Apache Isis can support this.</p> 
-              </div> </td> 
-            </tr> 
-           </tbody>
-          </table> 
-         </div> 
-         <div class="paragraph"> 
-          <p>The <code>RunSpecs</code> class to run this feature (and any other features in this package or subpackages) is just boilerplate</p> 
-         </div> 
-         <div class="listingblock"> 
-          <div class="content"> 
-           <pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@RunWith</span>(Cucumber.class)
+        </div> 
+        <div class="paragraph"> 
+         <p>The "@DomainAppDemo" is a custom tag we’ve specified to indicate the prerequisite fixtures to be loaded; more on this in a moment.</p> 
+        </div> 
+        <div class="admonitionblock note"> 
+         <table> 
+          <tbody>
+           <tr> 
+            <td class="icon"> <i class="fa icon-note" title="Note"></i> </td> 
+            <td class="content"> 
+             <div class="paragraph"> 
+              <p>Prior to <code>1.16.0-SNAPSHOT</code> the BDD spec support provided by the framework aimed to allow tests to be written either as integration tests or as unit tests. While there are good reasons for attempting this (see <a href="http://silkandspinach.net/2013/01/18/a-testing-strategy/">these</a> <a href="http://claysnow.co.uk/the-testing-iceberg/">blog</a> <a href="http://claysnow.co.uk/living-documentation-can-be-readable-and-fast/">posts</a>), the downside is that the programming model to support unit tests is quite different from "normal" Isis code.</p> 
+             </div> 
+             <div class="paragraph"> 
+              <p>This feature is therefore being dropped. As of <code>1.16.0-SNAPSHOT</code>, BDD specs are assumed to run only as integration tests.</p> 
+             </div> </td> 
+           </tr> 
+          </tbody>
+         </table> 
+        </div> 
+        <div class="paragraph"> 
+         <p>The <code>RunBddSpecs</code> class to run this feature (and any other features in this package or subpackages) is just boilerplate</p> 
+        </div> 
+        <div class="listingblock"> 
+         <div class="content"> 
+          <pre class="CodeRay highlight"><code data-lang="java"><span class="annotation">@RunWith</span>(Cucumber.class)
 <span class="annotation">@CucumberOptions</span>(
         format = {
                 <span class="string"><span class="delimiter">"</span><span class="content">html:target/cucumber-html-report</span><span class="delimiter">"</span></span>
                 ,<span class="string"><span class="delimiter">"</span><span class="content">json:target/cucumber.json</span><span class="delimiter">"</span></span>
         },
-        glue={<span class="string"><span class="delimiter">"</span><span class="content">classpath:domainapp.integtests.specglue</span><span class="delimiter">"</span></span>},
+        glue={
+                <span class="string"><span class="delimiter">"</span><span class="content">classpath:domainapp.application.bdd.specglue</span><span class="delimiter">"</span></span>,
+                <span class="string"><span class="delimiter">"</span><span class="content">classpath:domainapp.modules.simple.specglue</span><span class="delimiter">"</span></span>
+        },
         strict = <span class="predefined-constant">true</span>,
-        tags = { <span class="string"><span class="delimiter">"</span><span class="content">~@backlog</span><span class="delimiter">"</span></span>, <span class="string"><span class="delimiter">"</span><span class="content">~@ignore</span><span class="delimiter">"</span></span> })
-<span class="directive">public</span> <span class="type">class</span> <span class="class">RunSpecs</span> {
+        tags = { <span class="string"><span class="delimiter">"</span><span class="content">~@backlog</span><span class="delimiter">"</span></span>, <span class="string"><span class="delimiter">"</span><span class="content">~@ignore</span><span class="delimiter">"</span></span> }
+)
+<span class="directive">public</span> <span class="type">class</span> <span class="class">RunBddSpecs</span> {
     <span class="comment">// intentionally empty</span>
 }</code></pre> 
-          </div> 
          </div> 
-         <div class="paragraph"> 
-          <p>The JSON formatter allows integration with enhanced reports. (Commented out) configuration for this is provided in the <a href="../ugfun/ugfun.html#_ugfun_getting-started_simpleapp-archetype">SimpleApp archetype</a>.</p> 
-         </div> 
-         <div class="paragraph"> 
-          <p>The bootstrapping of Apache Isis can be moved into a <code>BootstrappingGlue</code> step definition:</p> 
-         </div> 
-         <div class="listingblock"> 
-          <div class="content"> 
-           <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">class</span> <span class="class">BootstrappingGlue</span> <span class="directive">extends</span> CukeGlueAbstract {
-    <span class="annotation">@Before</span>(value={<span class="string"><span class="delimiter">"</span><span class="content">@integration</span><span class="delimiter">"</span></span>}, order=<span class="integer">100</span>)
-    <span class="directive">public</span> <span class="type">void</span> beforeScenarioIntegrationScope() {
-        org.apache.log4j.PropertyConfigurator.configure(<span class="string"><span class="delimiter">"</span><span class="content">logging.properties</span><span class="delimiter">"</span></span>);
-        SimpleAppSystemInitializer.initIsft();
-
-        before(ScenarioExecutionScope.INTEGRATION);
-    }
-    <span class="annotation">@After</span>
-    <span class="directive">public</span> <span class="type">void</span> afterScenario(cucumber.api.Scenario sc) {
-        assertMocksSatisfied();
-        after(sc);
+        </div> 
+        <div class="paragraph"> 
+         <p>The JSON formatter allows integration with enhanced reports. (Commented out) configuration for this is provided in the <a href="../ugfun/ugfun.html#_ugfun_getting-started_simpleapp-archetype">SimpleApp archetype</a>.</p> 
+        </div> 
+        <div class="paragraph"> 
+         <p>The bootstrapping of Apache Isis itself lives in a <code>BootstrappingGlue</code> step definition:</p> 
+        </div> 
+        <div class="listingblock"> 
+         <div class="content"> 
+          <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">class</span> <span class="class">BootstrappingGlue</span> <span class="directive">extends</span> CukeGlueBootstrappingAbstract {  <i class="conum" data-value="1"></i><b>(1)</b>
+    <span class="directive">public</span> BootstrappingGlue() {
+        <span class="local-variable">super</span>(<span class="keyword">new</span> DomainAppApplicationModule());                        <i class="conum" data-value="2"></i><b>(2)</b>
     }
 }</code></pre> 
-          </div> 
-         </div> 
-         <div class="paragraph"> 
-          <p>The fixture to run also lives in its own step definition, <a href="https://github.com/apache/isis/blob/07fe61ef3fb029ae36427f60da2afeeb931e4f88/example/application/simpleapp/integtests/src/test/java/domainapp/integtests/specglue/CatalogOfFixturesGlue.java#L24"><code>CatalogOfFixturesGlue</code></a>:</p> 
          </div> 
-         <div class="listingblock"> 
-          <div class="content"> 
-           <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">class</span> <span class="class">CatalogOfFixturesGlue</span> <span class="directive">extends</span> CukeGlueAbstract {
-    <span class="annotation">@Before</span>(value={<span class="string"><span class="delimiter">"</span><span class="content">@integration</span><span class="delimiter">"</span></span>, <span class="string"><span class="delimiter">"</span><span class="content">@SimpleObjectsFixture</span><span class="delimiter">"</span></span>}, order=<span class="integer">20000</span>)
-    <span class="directive">public</span> <span class="type">void</span> integrationFixtures() <span class="directive">throws</span> <span class="predefined-type">Throwable</span> {
-        scenarioExecution().install(<span class="keyword">new</span> RecreateSimpleObjects());
+        </div> 
+        <div class="colist arabic"> 
+         <table> 
+          <tbody>
+           <tr> 
+            <td><i class="conum" data-value="1"></i><b>1</b></td> 
+            <td>superclass contains the bootstrapping logic. This reuses many of the same classes as the integration testing framework</td> 
+           </tr> 
+           <tr> 
+            <td><i class="conum" data-value="2"></i><b>2</b></td> 
+            <td>the <code>Module</code> to use to bootstrap the application in headless mode.</td> 
+           </tr> 
+          </tbody>
+         </table> 
+        </div> 
+        <div class="paragraph"> 
+         <p>The fixture to run also lives in its own step definition, <code>CatalogOfFixturesGlue</code>:</p> 
+        </div> 
+        <div class="listingblock"> 
+         <div class="content"> 
+          <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">class</span> <span class="class">CatalogOfFixturesGlue</span> <span class="directive">extends</span> CukeGlueAbstract2 {
+    <span class="annotation">@Before</span>(value={<span class="string"><span class="delimiter">"</span><span class="content">@DomainAppDemo</span><span class="delimiter">"</span></span>}, order=<span class="integer">20000</span>)
+    <span class="directive">public</span> <span class="type">void</span> runDomainAppDemo() {
+        fixtureScripts.runFixtureScript(<span class="keyword">new</span> DomainAppDemo(), <span class="predefined-constant">null</span>); <i class="conum" data-value="1"></i><b>(1)</b>
     }
 }</code></pre> 
-          </div> 
-         </div> 
-         <div class="paragraph"> 
-          <p>Note that this is annotated with a tag (<code>@SimpleObjectsFixture</code>) so that the correct fixture runs. (We might have a whole variety of these).</p> 
-         </div> 
-         <div class="paragraph"> 
-          <p>The step definitions pertaining to <code>SimpleObject</code> domain entity then reside in the <a href="https://github.com/apache/isis/blob/07fe61ef3fb029ae36427f60da2afeeb931e4f88/example/application/simpleapp/integtests/src/test/java/domainapp/integtests/specglue/modules/simple/SimpleObjectGlue.java#L31"><code>SimpleObjectGlue</code></a> class. This is where the heavy lifting gets done:</p> 
          </div> 
-         <div class="listingblock"> 
-          <div class="content"> 
-           <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">class</span> <span class="class">SimpleObjectGlue</span> <span class="directive">extends</span> CukeGlueAbstract {
-    <span class="annotation">@Given</span>(<span class="string"><span class="delimiter">"</span><span class="content">^there are.* (</span><span class="char">\\</span><span class="content">d+) simple objects$</span><span class="delimiter">"</span></span>)
-    <span class="directive">public</span> <span class="type">void</span> there_are_N_simple_objects(<span class="type">int</span> n) <span class="directive">throws</span> <span class="predefined-type">Throwable</span> {
-        <span class="keyword">try</span> {
-            <span class="directive">final</span> <span class="predefined-type">List</span>&lt;SimpleObject&gt; findAll = service(SimpleObjects.class).listAll();
-            assertThat(findAll.size(), is(n));
-            putVar(<span class="string"><span class="delimiter">"</span><span class="content">list</span><span class="delimiter">"</span></span>, <span class="string"><span class="delimiter">"</span><span class="content">all</span><span class="delimiter">"</span></span>, findAll);
+        </div> 
+        <div class="colist arabic"> 
+         <table> 
+          <tbody>
+           <tr> 
+            <td><i class="conum" data-value="1"></i><b>1</b></td> 
+            <td>The <code>fixtureScripts</code> service is inherited from the superclass.</td> 
+           </tr> 
+          </tbody>
+         </table> 
+        </div> 
+        <div class="paragraph"> 
+         <p>This will only activate for feature files tagged with "@DomainAppDemo".</p> 
+        </div> 
+        <div class="paragraph"> 
+         <p>Finally, the step definitions pertaining to <code>SimpleObject</code> domain entity then reside in the <code>SimpleObjectGlue</code> class. This is where the heavy lifting gets done:</p> 
+        </div> 
+        <div class="listingblock"> 
+         <div class="content"> 
+          <pre class="CodeRay highlight"><code data-lang="java"><span class="directive">public</span> <span class="type">class</span> <span class="class">SimpleObjectMenuGlue</span> <span class="directive">extends</span> CukeGlueAbstract2 {
 
-        } <span class="keyword">finally</span> {
-            assertMocksSatisfied();
-        }
+    <span class="annotation">@Given</span>(<span class="string"><span class="delimiter">"</span><span class="content">^there are.* (</span><span class="char">\\</span><span class="content">d+) simple objects$</span><span class="delimiter">"</span></span>)                           <i class="conum" data-value="1"></i><b>(1)</b>
+    <span class="directive">public</span> <span class="type">void</span> there_are_N_simple_objects(<span class="type">int</span> n) <span class="directive">throws</span> <span class="predefined-type">Throwable</span> {
+        <span class="directive">final</span> <span class="predefined-type">List</span>&lt;SimpleObject&gt; list = wrap(simpleObjectMenu).listAll();   <i class="conum" data-value="2"></i><b>(2)</b>
+        assertThat(list.size(), is(n));
     }
-    <span class="annotation">@When</span>(<span class="string"><span class="delimiter">"</span><span class="content">^I create a new simple object$</span><span class="delimiter">"</span></span>)
-    <span class="directive">public</span> <span class="type">void</span> I_create_a_new_simple_object() <span class="directive">throws</span> <span class="predefined-type">Throwable</span> {
-        service(SimpleObjects.class).create(<span class="predefined-type">UUID</span>.randomUUID().toString());
+
+    <span class="annotation">@When</span>(<span class="string"><span class="delimiter">"</span><span class="content">^.*create a .*simple object$</span><span class="delimiter">"</span></span>)
+    <span class="directive">public</span> <span class="type">void</span> create_a_simple_object() <span class="directive">throws</span> <span class="predefined-type">Throwable</span> {
+        wrap(simpleObjectMenu).create(<span class="predefined-type">UUID</span>.randomUUID().toString());
     }
+
+    <span class="annotation">@Inject</span>
+    SimpleObjectMenu simpleObjectMenu;                                      <i class="conum" data-value="3"></i><b>(3)</b>
 }</code></pre> 
-          </div> 
-         </div> 
-         <div class="admonitionblock tip"> 
-          <table> 
-           <tbody>
-            <tr> 
-             <td class="icon"> <i class="fa icon-tip" title="Tip"></i> </td> 
-             <td class="content"> 
-              <div class="paragraph"> 
-               <p>If using Java 8, note that Cucumber JVM supports a <a href="https://cucumber.io/docs/reference/jvm#java-8-lambdas">simplified syntax using lambdas</a>.</p> 
-              </div> </td> 
-            </tr> 
-           </tbody>
-          </table> 
          </div> 
         </div> 
-        <div class="sect2"> 
-         <h3 id="_ugtst_bdd-spec-support_bdd-tooling">5.4. BDD Tooling</h3>
-         <div class="btn-group" style="float: right; font-size: small; padding: 6px; margin-top: -55px; ">
-          <button type="button" class="btn btn-xs btn-default" onclick="window.location.href=&quot;https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_bdd-spec-support_bdd-tooling.adoc&quot;"><i class="fa fa-pencil-square-o"></i>&nbsp;Edit</button>
-          <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span class="caret"></span><span class="sr-only">Toggle Dropdown</span></button>
-          <ul class="dropdown-menu">
-           <li><a href="https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_bdd-spec-support_bdd-tooling.adoc" target="_blank"><i class="fa fa-pencil-square-o fa-fw" aria-hidden="true"></i>&nbsp; Edit</a></li>
-           <li><a href="https://github.com/apache/isis/commits/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_bdd-spec-support_bdd-tooling.adoc" target="_blank"><i class="fa fa-clock-o fa-fw" aria-hidden="true"></i>&nbsp; History</a></li>
-           <li><a href="https://github.com/apache/isis/raw/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_bdd-spec-support_bdd-tooling.adoc" target="_blank"><i class="fa fa-file-text-o fa-fw" aria-hidden="true"></i>&nbsp; Raw</a></li>
-           <li><a href="https://github.com/apache/isis/blame/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_bdd-spec-support_bdd-tooling.adoc" target="_blank"><i class="fa fa-hand-o-right fa-fw" aria-hidden="true"></i>&nbsp; Blame</a></li>
-          </ul>
-         </div> 
-         <div class="paragraph"> 
-          <p>To help write feature files and generate step definitions, we recommend <a href="https://github.com/rlogiacco/Natural">Roberto Lo Giacco’s Eclipse plugin</a>. For more information, see Dan’s short <a href="http://danhaywood.com/2013/07/05/cucumber-editors-in-eclipse/">blog post</a>. It works very well. Of interest: this is implemented using <a href="http://www.eclipse.org/Xtext/">XText</a>.</p> 
-         </div> 
+        <div class="colist arabic"> 
+         <table> 
+          <tbody>
+           <tr> 
+            <td><i class="conum" data-value="1"></i><b>1</b></td> 
+            <td>regex to match to feature file specification</td> 
+           </tr> 
+           <tr> 
+            <td><i class="conum" data-value="2"></i><b>2</b></td> 
+            <td>the inherited <code>wrap(…​)</code> method delegates to <code>WrapperFactory#wrap(…​)</code></td> 
+           </tr> 
+           <tr> 
+            <td><i class="conum" data-value="3"></i><b>3</b></td> 
+            <td>injected in the usual way</td> 
+           </tr> 
+          </tbody>
+         </table> 
+        </div> 
+        <div class="admonitionblock tip"> 
+         <table> 
+          <tbody>
+           <tr> 
+            <td class="icon"> <i class="fa icon-tip" title="Tip"></i> </td> 
+            <td class="content"> 
+             <div class="paragraph"> 
+              <p>The <a href="rgsvc.html#_rgsvc_api_Scratchpad"><code>Scratchpad</code></a> domain service is one way in which glue classes can pass state between each other. Or, for more type safety, you could develop your own custom domain services for each scenario, and inject these in as regular services. See <a href="http://www.thinkcode.se/blog/2017/04/01/sharing-state-between-steps-in-cucumberjvm-using-picocontainer">this blog</a> post for more details.</p> 
+             </div> </td> 
+           </tr> 
+          </tbody>
+         </table> 
+        </div> 
+        <div class="admonitionblock tip"> 
+         <table> 
+          <tbody>
+           <tr> 
+            <td class="icon"> <i class="fa icon-tip" title="Tip"></i> </td> 
+            <td class="content"> 
+             <div class="paragraph"> 
+              <p>If using Java 8, note that Cucumber JVM supports a <a href="https://cucumber.io/docs/reference/jvm#java-8-lambdas">simplified syntax using lambdas</a>.</p> 
+             </div> </td> 
+           </tr> 
+          </tbody>
+         </table> 
         </div> 
         <div class="sect2"> 
-         <h3 id="_ugtst_bdd-spec-support_maven-configuration">5.5. Maven Configuration</h3>
-         <div class="btn-group" style="float: right; font-size: small; padding: 6px; margin-top: -55px; ">
-          <button type="button" class="btn btn-xs btn-default" onclick="window.location.href=&quot;https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_bdd-spec-support_maven-configuration.adoc&quot;"><i class="fa fa-pencil-square-o"></i>&nbsp;Edit</button>
-          <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span class="caret"></span><span class="sr-only">Toggle Dropdown</span></button>
-          <ul class="dropdown-menu">
-           <li><a href="https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_bdd-spec-support_maven-configuration.adoc" target="_blank"><i class="fa fa-pencil-square-o fa-fw" aria-hidden="true"></i>&nbsp; Edit</a></li>
-           <li><a href="https://github.com/apache/isis/commits/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_bdd-spec-support_maven-configuration.adoc" target="_blank"><i class="fa fa-clock-o fa-fw" aria-hidden="true"></i>&nbsp; History</a></li>
-           <li><a href="https://github.com/apache/isis/raw/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_bdd-spec-support_maven-configuration.adoc" target="_blank"><i class="fa fa-file-text-o fa-fw" aria-hidden="true"></i>&nbsp; Raw</a></li>
-           <li><a href="https://github.com/apache/isis/blame/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_bdd-spec-support_maven-configuration.adoc" target="_blank"><i class="fa fa-hand-o-right fa-fw" aria-hidden="true"></i>&nbsp; Blame</a></li>
-          </ul>
-         </div> 
+         <h3 id="_ugtst_bdd-spec-support_maven-configuration">6.1. Maven Configuration</h3> 
          <div class="paragraph"> 
           <p>Apache Isis' BDD spec support is automatically configured if you use the <a href="../ugfun/ugfun.html#_ugfun_getting-started_simpleapp-archetype">SimpleApp archetype</a>. To set it up manually, update the <code>pom.xml</code> of your domain object model module:</p> 
          </div> 
@@ -2645,45 +2638,33 @@ Feature: <span class="predefined-type">List</span> and Create New Simple Objects
           </table> 
          </div> 
          <div class="paragraph"> 
-          <p>We also recommend that you configure the <code>maven-surefire-plugin</code> to pick up the following class patterns:</p> 
+          <p>As of <code>1.14.0</code>, the configuration is wrapped up as maven mixins:</p> 
          </div> 
          <div class="listingblock"> 
           <div class="content"> 
-           <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;plugin&gt;</span>
-    <span class="tag">&lt;groupId&gt;</span>org.apache.maven.plugins<span class="tag">&lt;/groupId&gt;</span>
-    <span class="tag">&lt;artifactId&gt;</span>maven-surefire-plugin<span class="tag">&lt;/artifactId&gt;</span>
-    <span class="tag">&lt;version&gt;</span>2.10<span class="tag">&lt;/version&gt;</span>
-    <span class="tag">&lt;configuration&gt;</span>
-        <span class="tag">&lt;includes&gt;</span>
-            <span class="tag">&lt;include&gt;</span>**/*Test.java<span class="tag">&lt;/include&gt;</span>
-            <span class="tag">&lt;include&gt;</span>**/*Test_*.java<span class="tag">&lt;/include&gt;</span>
-            <span class="tag">&lt;include&gt;</span>**/*Spec*.java<span class="tag">&lt;/include&gt;</span>
-        <span class="tag">&lt;/includes&gt;</span>
-        <span class="tag">&lt;excludes&gt;</span>
-            <span class="tag">&lt;exclude&gt;</span>**/Test*.java<span class="tag">&lt;/exclude&gt;</span>
-            <span class="tag">&lt;exclude&gt;</span>**/*ForTesting.java<span class="tag">&lt;/exclude&gt;</span>
-            <span class="tag">&lt;exclude&gt;</span>**/*Abstract*.java<span class="tag">&lt;/exclude&gt;</span>
-        <span class="tag">&lt;/excludes&gt;</span>
-        <span class="tag">&lt;useFile&gt;</span>true<span class="tag">&lt;/useFile&gt;</span>
-        <span class="tag">&lt;printSummary&gt;</span>true<span class="tag">&lt;/printSummary&gt;</span>
-        <span class="tag">&lt;outputDirectory&gt;</span>${project.build.directory}/surefire-reports<span class="tag">&lt;/outputDirectory&gt;</span>
-    <span class="tag">&lt;/configuration&gt;</span>
-<span class="tag">&lt;/plugin&gt;</span></code></pre> 
+           <pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;plugins&gt;</span>
+    <span class="tag">&lt;plugin&gt;</span>
+        <span class="tag">&lt;groupId&gt;</span>com.github.odavid.maven.plugins<span class="tag">&lt;/groupId&gt;</span>
+        <span class="tag">&lt;artifactId&gt;</span>mixin-maven-plugin<span class="tag">&lt;/artifactId&gt;</span>
+        <span class="tag">&lt;version&gt;</span>0.1-alpha-39<span class="tag">&lt;/version&gt;</span>
+        <span class="tag">&lt;extensions&gt;</span>true<span class="tag">&lt;/extensions&gt;</span>
+        <span class="tag">&lt;configuration&gt;</span>
+            <span class="tag">&lt;mixins&gt;</span>
+                ...
+                <span class="tag">&lt;mixin&gt;</span>
+                    <span class="tag">&lt;groupId&gt;</span>com.danhaywood.mavenmixin<span class="tag">&lt;/groupId&gt;</span>
+                    <span class="tag">&lt;artifactId&gt;</span>surefire<span class="tag">&lt;/artifactId&gt;</span>
+                <span class="tag">&lt;/mixin&gt;</span>
+                <span class="tag">&lt;mixin&gt;</span>
+                    <span class="tag">&lt;groupId&gt;</span>com.danhaywood.mavenmixin<span class="tag">&lt;/groupId&gt;</span>
+                    <span class="tag">&lt;artifactId&gt;</span>cucumberreporting<span class="tag">&lt;/artifactId&gt;</span>
+                <span class="tag">&lt;/mixin&gt;</span>
+            <span class="tag">&lt;/mixins&gt;</span>
+        <span class="tag">&lt;/configuration&gt;</span>
+    <span class="tag">&lt;/plugin&gt;</span>
+<span class="tag">&lt;/plugins&gt;</span></code></pre> 
           </div> 
          </div> 
-         <div class="admonitionblock note"> 
-          <table> 
-           <tbody>
-            <tr> 
-             <td class="icon"> <i class="fa icon-note" title="Note"></i> </td> 
-             <td class="content"> 
-              <div class="paragraph"> 
-               <p>As of <code>1.14.0</code>, this configuration has been replaced to use mavenmixins.</p> 
-              </div> </td> 
-            </tr> 
-           </tbody>
-          </table> 
-         </div> 
          <div class="paragraph"> 
           <p>You may also find it more convenient to place the <code>.feature</code> files in <code>src/test/java</code>, rather than <code>src/test/resources</code>. If you wish to do this, then your integtest module’s <code>pom.xml</code> must contain:</p> 
          </div> 
@@ -2713,7 +2694,7 @@ Feature: <span class="predefined-type">List</span> and Create New Simple Objects
        </div> 
       </div> 
       <div class="sect1"> 
-       <h2 id="_ugtst_fixture-scripts">6. Fixture Scripts</h2>
+       <h2 id="_ugtst_fixture-scripts">7. Fixture Scripts</h2>
        <div class="btn-group" style="float: right; font-size: small; padding: 6px; margin-top: -55px; ">
         <button type="button" class="btn btn-xs btn-default" onclick="window.location.href=&quot;https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_fixture-scripts.adoc&quot;"><i class="fa fa-pencil-square-o"></i>&nbsp;Edit</button>
         <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span class="caret"></span><span class="sr-only">Toggle Dropdown</span></button>
@@ -2770,7 +2751,7 @@ Feature: <span class="predefined-type">List</span> and Create New Simple Objects
          <p>The following sections explain the API and how to go about using the API.</p> 
         </div> 
         <div class="sect2"> 
-         <h3 id="_ugtst_fixture-scripts_api-and-usage">6.1. API and Usage</h3>
+         <h3 id="_ugtst_fixture-scripts_api-and-usage">7.1. API and Usage</h3>
          <div class="btn-group" style="float: right; font-size: small; padding: 6px; margin-top: -55px; ">
           <button type="button" class="btn btn-xs btn-default" onclick="window.location.href=&quot;https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_fixture-scripts_api-and-usage.adoc&quot;"><i class="fa fa-pencil-square-o"></i>&nbsp;Edit</button>
           <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span class="caret"></span><span class="sr-only">Toggle Dropdown</span></button>
@@ -2794,7 +2775,7 @@ Feature: <span class="predefined-type">List</span> and Create New Simple Objects
           <p>Let’s look at <code>FixtureScripts</code> domain service in more detail first.</p> 
          </div> 
          <div class="sect3"> 
-          <h4 id="__code_fixturescripts_code">6.1.1. <code>FixtureScripts</code></h4> 
+          <h4 id="__code_fixturescripts_code">7.1.1. <code>FixtureScripts</code></h4> 
           <div class="paragraph"> 
            <p>There are two ways in which you can provide a <code>FixtureScripts</code> service.</p> 
           </div> 
@@ -2979,7 +2960,7 @@ Feature: <span class="predefined-type">List</span> and Create New Simple Objects
           </div> 
          </div> 
          <div class="sect3"> 
-          <h4 id="__code_fixturescript_code">6.1.2. <code>FixtureScript</code></h4> 
+          <h4 id="__code_fixturescript_code">7.1.2. <code>FixtureScript</code></h4> 
           <div class="paragraph"> 
            <p>A fixture script is ultimately just a block of code that can be executed, so it’s up to you how you implement it to set up the system. However, we strongly recommend that you use it to invoke actions on business objects, in essence to replay what a real-life user would have done. That way, the fixture script will remain valid even if the underlying implementation of the system changes in the future.</p> 
           </div> 
@@ -3162,7 +3143,7 @@ Feature: <span class="predefined-type">List</span> and Create New Simple Objects
           </div> 
          </div> 
          <div class="sect3"> 
-          <h4 id="_using_within_tests">6.1.3. Using within Tests</h4> 
+          <h4 id="_using_within_tests">7.1.3. Using within Tests</h4> 
           <div class="paragraph"> 
            <p>Fixture scripts can be called from integration tests just the same way that fixture scripts can call one another.</p> 
           </div> 
@@ -3227,7 +3208,7 @@ Feature: <span class="predefined-type">List</span> and Create New Simple Objects
           </div> 
          </div> 
          <div class="sect3"> 
-          <h4 id="__ugtst_fixture-scripts_api-and-usage_organizing">6.1.4. Organizing Fixture scripts</h4> 
+          <h4 id="__ugtst_fixture-scripts_api-and-usage_organizing">7.1.4. Organizing Fixture scripts</h4> 
           <div class="paragraph"> 
            <p>There are lots of ways to organize fixture scripts, but we’ve used them as either:</p> 
           </div> 
@@ -3310,7 +3291,7 @@ Feature: <span class="predefined-type">List</span> and Create New Simple Objects
          </div> 
         </div> 
         <div class="sect2"> 
-         <h3 id="_ugtst_fixture-scripts_sudo-service">6.2. <code>SudoService</code></h3>
+         <h3 id="_ugtst_fixture-scripts_sudo-service">7.2. <code>SudoService</code></h3>
          <div class="btn-group" style="float: right; font-size: small; padding: 6px; margin-top: -55px; ">
           <button type="button" class="btn btn-xs btn-default" onclick="window.location.href=&quot;https://github.com/apache/isis/edit/master/adocs/documentation/src/main/asciidoc/guides/ugtst/_ugtst_fixture-scripts_sudo-service.adoc&quot;"><i class="fa fa-pencil-square-o"></i>&nbsp;Edit</button>
           <button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span class="caret"></span><span class="sr-only">Toggle Dropdown</span></button>