http://git-wip-us.apache.org/repos/asf/isis-site/blob/9d921a51/content/guides/ugtst/ugtst.html
----------------------------------------------------------------------
diff --git a/content/guides/ugtst/ugtst.html b/content/guides/ugtst/ugtst.html
index 40c79cd..40b0432 100644
--- a/content/guides/ugtst/ugtst.html
+++ b/content/guides/ugtst/ugtst.html
@@ -179,6 +179,7 @@ table.CodeRay td.code>pre{padding:0}
         <li><a href="../../guides/ugfun/ugfun.html">Fundamentals</a></li> 
         <li><a href="../../guides/ugvw/ugvw.html">Wicket Viewer</a></li> 
         <li><a href="../../guides/ugvro/ugvro.html">Restful Objects 
Viewer</a></li> 
+        <li><a href="../../guides/ugodn/ugodn.html">DataNucleus Object 
Store</a></li> 
         <li><a href="../../guides/ugsec/ugsec.html">Security</a></li> 
         <li><a href="../../guides/ugtst/ugtst.html">Testing</a></li> 
         <li><a href="../../guides/ugbtb/ugbtb.html">Beyond the Basics</a></li> 
@@ -196,25 +197,32 @@ table.CodeRay td.code>pre{padding:0}
        </ul> </li> 
       <li class="dropdown  hidden-sm hidden-md"> <a href="#" 
class="dropdown-toggle" data-toggle="dropdown" role="button" 
aria-haspopup="true" aria-expanded="false">Downloads<span 
class="caret"></span></a> 
        <ul class="dropdown-menu"> 
-        <li><a href="../../downloads.html">Downloads</a></li> 
-        <li><a href="../../release-notes/release-notes.html">Release 
Notes</a></li> 
-        <li><a href="../../migration-notes/migration-notes.html">Migration 
Notes</a></li> 
-        <li role="separator" class="divider"></li> 
         <li class="dropdown-header">Maven archetypes</li> 
         <li><a 
href="../../guides/ugfun/ugfun.html#_ugfun_getting-started_helloworld-archetype">helloworld</a></li>
 
         <li><a 
href="../../guides/ugfun/ugfun.html#_ugfun_getting-started_simpleapp-archetype">simpleapp</a></li>
 
         <li role="separator" class="divider"></li> 
-        <li><a href="https://issues.apache.org/jira/browse/ISIS";>ASF 
JIRA</a></li> 
+        <li><a href="../../downloads.html">Downloads</a></li> 
+        <li><a href="../../release-notes/release-notes.html">Release 
Notes</a></li> 
+        <li><a href="../../migration-notes/migration-notes.html">Migration 
Notes</a></li> 
+        <li role="separator" class="divider"></li> 
         <li><a href="https://github.com/apache/isis";>Github mirror</a></li> 
        </ul> </li> 
       <li class="dropdown  hidden-sm"> <a href="#" class="dropdown-toggle" 
data-toggle="dropdown" role="button" aria-haspopup="true" 
aria-expanded="false">Support<span class="caret"></span></a> 
        <ul class="dropdown-menu"> 
-        <li><a href="../../support.html">Mailing lists</a></li> 
+        <li class="dropdown-header">Guides</li> 
+        <li><a href="../../guides/dg/dg.html">Developers' Guide</a></li> 
+        <li><a href="../../guides/cgcom/cgcom.html">Committers' Guide</a></li> 
+        <li><a href="../../guides/htg.html">Hints-n-Tips Guide</a></li> 
+        <li role="separator" class="divider"></li> 
+        <li class="dropdown-header">Mailing Lists</li> 
+        <li><a href="../../support.html">How to subscribe</a></li> 
         <li><a 
href="https://lists.apache.org/[email protected]";>Archives (ASF 
Pony mail)</a></li> 
         <li><a href="http://isis.markmail.org/search/?q=";>Archives 
(Markmail)</a></li> 
+        <li role="separator" class="divider"></li> 
+        <li class="dropdown-header">Other Resources</li> 
+        <li><a href="https://issues.apache.org/jira/browse/ISIS";>ASF 
JIRA</a></li> 
         <li><a href="http://stackoverflow.com/questions/tagged/isis";>Stack 
Overflow</a></li> 
-        <li><a href="../../guides/dg/dg.html">How to contribute</a></li> 
-        <li><a href="../../help.html">Other resources</a></li> 
+        <li><a href="../../help.html">Wiki, Fisheye etc.</a></li> 
        </ul> </li> 
       <li class="dropdown hidden-sm hidden-md"> <a href="#" 
class="dropdown-toggle" data-toggle="dropdown" role="button" 
aria-haspopup="true" aria-expanded="false">@ASF<span class="caret"></span></a> 
        <ul class="dropdown-menu"> 
@@ -1067,7 +1075,7 @@ CustomerRepository customers;</code></pre>
              <td class="icon"> <i class="fa icon-note" title="Note"></i> </td> 
              <td class="content"> 
               <div class="paragraph"> 
-               <p>(As of <code>1.15.0</code>) this can also be done by adding 
a dependency to <code>org.apache.isis.mavendeps:isis-mavendeps-testing</code> 
module; see the <a 
href="../ugfun/ugfun.html#_ugfun_getting-started_simpleapp-archetype">SimpleApp 
archetype</a>.</p> 
+               <p>This can also be done by adding a dependency to 
<code>org.apache.isis.mavendeps:isis-mavendeps-testing</code> module; see the 
<a 
href="../ugfun/ugfun.html#_ugfun_getting-started_simpleapp-archetype">SimpleApp 
archetype</a>.</p> 
               </div> </td> 
             </tr> 
            </tbody>
@@ -1107,7 +1115,7 @@ CustomerRepository customers;</code></pre>
              <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 can also be done using 
mavenmixins; see the <a 
href="../ugfun/ugfun.html#_ugfun_getting-started_simpleapp-archetype">SimpleApp 
archetype</a>.</p> 
+               <p>This can also be done using mavenmixins; see the <a 
href="../ugfun/ugfun.html#_ugfun_getting-started_simpleapp-archetype">SimpleApp 
archetype</a>.</p> 
               </div> </td> 
             </tr> 
            </tbody>
@@ -1349,272 +1357,26 @@ CustomerRepository customers;</code></pre>
           <p>Integration tests instantiate an Apache Isis "runtime" (as a 
singleton) within a JUnit test. Because (depending on the size of your app) it 
takes a little time to bootstrap Apache Isis, the framework caches the runtime 
on a thread-local from one test to the next.</p> 
          </div> 
          <div class="paragraph"> 
-          <p>Newer releases of the framework reduce the amount of boilerplate 
to do this; this guide documents multiple versions.</p> 
+          <p>The recommended way to 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>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> 
+          <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="sect3"> 
-          <h4 id="_1_15_0_onwards">4.2.1. 1.15.0 onwards</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> 
-          </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> IntegrationTestAbstract2 {
-
-    <span class="annotation">@BeforeClass</span>
-    <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> 
-          <div class="paragraph"> 
-           <p>where <code>DomainAppAppManifest</code> in turn is:</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">DomainAppAppManifest</span> <span 
class="directive">extends</span> AppManifestAbstract {
-
-    <span class="directive">public</span> <span 
class="directive">static</span> <span class="directive">final</span> Builder 
BUILDER = Builder.forModules(
-                    SimpleModuleDomSubmodule.class,
-                    DomainAppApplicationModuleFixtureSubmodule.class,
-                    DomainAppApplicationModuleServicesSubmodule.class
-            )
-            .withConfigurationPropertiesFile(DomainAppAppManifest.class,
-                    <span class="string"><span class="delimiter">"</span><span 
class="content">isis.properties</span><span class="delimiter">"</span></span>,
-                    <span class="string"><span class="delimiter">"</span><span 
class="content">authentication_shiro.properties</span><span 
class="delimiter">"</span></span>,
-                    <span class="string"><span class="delimiter">"</span><span 
class="content">persistor_datanucleus.properties</span><span 
class="delimiter">"</span></span>,
-                    <span class="string"><span class="delimiter">"</span><span 
class="content">viewer_restfulobjects.properties</span><span 
class="delimiter">"</span></span>,
-                    <span class="string"><span class="delimiter">"</span><span 
class="content">viewer_wicket.properties</span><span 
class="delimiter">"</span></span>
-            ).withAuthMechanism(<span class="string"><span 
class="delimiter">"</span><span class="content">shiro</span><span 
class="delimiter">"</span></span>);
+         <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> DomainAppAppManifest() {
-        <span class="local-variable">super</span>(BUILDER);
+    <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>The <code>AppManifestAbstract</code> class (which is also used 
to bootstrap the regular app as well as integration tests) is discussed further 
<a 
href="../rgcms/rgcms.html#_rgcms_classes_AppManifest-bootstrapping">here</a>, 
while the <code>IntegrationTestAbstract2</code> class is discussed further <a 
href="#_ugtst_integ-test-support_abstract-class">here</a>.</p> 
-          </div> 
-         </div> 
-         <div class="sect3"> 
-          <h4 id="_1_13_0">4.2.2. 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> 
-          <div class="paragraph"> 
-           <p>The <code>AppManifest.Util</code> class allows configuration 
properties for integration testing to be defined (replacing the 
<code>IsisConfigurationForJdoIntegTests</code> of earlier releases).</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="type">class</span> <span 
class="class">DomainAppSystemInitializer</span> {
-    <span class="directive">public</span> <span 
class="directive">static</span> <span class="type">void</span> initIsft() {
-        IsisSystemForTest isft = IsisSystemForTest.getElseNull();
-        <span class="keyword">if</span>(isft == <span 
class="predefined-constant">null</span>) {
-            isft = <span class="keyword">new</span> IsisSystemForTest.Builder()
-                    .withLoggingAt(org.apache.log4j.Level.INFO)
-                    .with(<span class="keyword">new</span> 
DomainAppAppManifest() {
-                        <span class="annotation">@Override</span>
-                        <span class="directive">public</span> <span 
class="predefined-type">Map</span>&lt;<span 
class="predefined-type">String</span>, <span 
class="predefined-type">String</span>&gt; getConfigurationProperties() {
-                            <span class="directive">final</span> <span 
class="predefined-type">Map</span>&lt;<span 
class="predefined-type">String</span>, <span 
class="predefined-type">String</span>&gt; map = Maps.newHashMap();
-                            <span 
class="predefined-type">Util</span>.withJavaxJdoRunInMemoryProperties(map);
-                            <span 
class="predefined-type">Util</span>.withDataNucleusProperties(map);
-                            <span 
class="predefined-type">Util</span>.withIsisIntegTestProperties(map);
-                            <span class="keyword">return</span> map;
-                        }
-                    })
-                    .build();
-            isft.setUpSystem();
-            IsisSystemForTest.set(isft);
-        }
-    }
-}</code></pre> 
-           </div> 
-          </div> 
-          <div class="paragraph"> 
-           <p>The above code uses the <code>AppManifest.Util</code> helper 
class, which provides a number of static methods that can be used to set up <a 
href="#_ugtst_integ-test-support_configuration-properties">configuration 
properties</a> appropriate for integration testing (eg run using an in-memory 
database). This allows the responsibility of returning the configuration 
properties to belong exclusively to the <code>AppManifest</code>.</p> 
-          </div> 
-          <div class="paragraph"> 
-           <p>There are three such static methods:</p> 
-          </div> 
-          <div class="listingblock"> 
-           <div class="content"> 
-            <pre class="CodeRay highlight"><code data-lang="java"><span 
class="directive">public</span> <span class="type">interface</span> <span 
class="class">AppManifest</span> {
-  ...
-  public <span class="directive">static</span> <span class="type">class</span> 
<span class="class">Util</span> {
-    <span class="directive">public</span> <span 
class="directive">static</span> <span 
class="predefined-type">Map</span>&lt;<span 
class="predefined-type">String</span>,<span 
class="predefined-type">String</span>&gt;
-        withJavaxJdoRunInMemoryProperties(<span 
class="predefined-type">Map</span>&lt;<span 
class="predefined-type">String</span>, <span 
class="predefined-type">String</span>&gt; map) { ... }   <i class="conum" 
data-value="1"></i><b>(1)</b>
-    <span class="directive">public</span> <span 
class="directive">static</span> <span 
class="predefined-type">Map</span>&lt;<span 
class="predefined-type">String</span>,<span 
class="predefined-type">String</span>&gt;
-        withDataNucleusProperties(<span 
class="predefined-type">Map</span>&lt;<span 
class="predefined-type">String</span>, <span 
class="predefined-type">String</span>&gt; map) { ... }           <i 
class="conum" data-value="2"></i><b>(2)</b>
-    <span class="directive">public</span> <span 
class="directive">static</span> <span 
class="predefined-type">Map</span>&lt;<span 
class="predefined-type">String</span>,<span 
class="predefined-type">String</span>&gt;
-        withIsisIntegTestProperties(<span 
class="predefined-type">Map</span>&lt;<span 
class="predefined-type">String</span>, <span 
class="predefined-type">String</span>&gt; map) { ... }         <i class="conum" 
data-value="3"></i><b>(3)</b>
-  }
-}</code></pre> 
-           </div> 
-          </div> 
-          <div class="colist arabic"> 
-           <table> 
-            <tbody>
-             <tr> 
-              <td><i class="conum" data-value="1"></i><b>1</b></td> 
-              <td>sets up the <code>javax.jdo.option.Connection*</code> 
properties so as to run against an in-memory instance of HSQLDB</td> 
-             </tr> 
-             <tr> 
-              <td><i class="conum" data-value="2"></i><b>2</b></td> 
-              <td>sets up DataNucleus to automatically create the databse 
schema, as well as a number of other standard properties (disable persistence 
by reachability, support mixed case identifiers, disable level 2 cache)</td> 
-             </tr> 
-             <tr> 
-              <td><i class="conum" data-value="3"></i><b>3</b></td> 
-              <td>sets up standard properties for the Apache Isis framework, 
most specifically to enable fixtures to be installed.</td> 
-             </tr> 
-            </tbody>
-           </table> 
           </div> 
          </div> 
-         <div class="sect3"> 
-          <h4 id="_1_9_0">4.2.3. 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> 
-          <div class="paragraph"> 
-           <p>The suggested way to use this concept was using a "system 
initializer" class. This uses a <code>IsisConfigurationForJdoIntegTests</code> 
class to bring together the configuration properties (discussed further <a 
href="#_ugtst_integ-test-support_configuration-properties">here</a>) to 
bootstrap the application.</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="type">class</span> <span 
class="class">DomainAppSystemInitializer</span> {
-    <span class="directive">public</span> <span 
class="directive">static</span> <span class="type">void</span> initIsft() {
-        IsisSystemForTest isft = IsisSystemForTest.getElseNull();
-        <span class="keyword">if</span>(isft == <span 
class="predefined-constant">null</span>) {
-            isft = <span class="keyword">new</span> IsisSystemForTest.Builder()
-                    .withLoggingAt(org.apache.log4j.Level.INFO)
-                    .with(<span class="keyword">new</span> 
DomainAppAppManifest())
-                    .with(<span class="keyword">new</span> 
IsisConfigurationForJdoIntegTests())
-                    .build()
-                    .setUpSystem();
-            IsisSystemForTest.set(isft);
-        }
-    }
-}</code></pre> 
-           </div> 
-          </div> 
-          <div class="paragraph"> 
-           <p>where <code>DomainAppAppManifest</code> in turn is defined 
as:</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">DomainAppAppManifest</span> <span 
class="directive">implements</span> AppManifest {
-    <span class="annotation">@Override</span>
-    <span class="directive">public</span> <span 
class="predefined-type">List</span>&lt;<span 
class="predefined-type">Class</span>&lt;?&gt;&gt; getModules() {
-        <span class="keyword">return</span> <span 
class="predefined-type">Arrays</span>.asList(
-                domainapp.dom.DomainAppDomainModule.class,
-                domainapp.fixture.DomainAppFixtureModule.class,
-                domainapp.app.DomainAppAppModule.class
-        );
-    }
-    ...
-}</code></pre> 
-           </div> 
-          </div> 
-          <div class="paragraph"> 
-           <p>Further details on bootstrapping with the 
<code>AppManifest</code> can be found in the <a 
href="../rgcms/rgcms.html#_rgcms_classes_AppManifest-bootstrapping">reference 
guide</a>.</p> 
-          </div> 
+         <div class="paragraph"> 
+          <p>where <code>DomainAppApplicationModule</code> in turn declares 
all the dependencies that make up the application.</p> 
          </div> 
-         <div class="sect3"> 
-          <h4 id="_1_8_0_and_earlier">4.2.4. 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> 
-          <div class="listingblock"> 
-           <div class="content"> 
-            <pre class="CodeRay highlight"><code data-lang="java"><span 
class="directive">private</span> <span class="directive">static</span> <span 
class="type">class</span> <span class="class">DomainAppSystemBuilder</span> 
<span class="directive">extends</span> IsisSystemForTest.Builder {      <i 
class="conum" data-value="1"></i><b>(1)</b>
-    <span class="directive">public</span> DomainAppSystemBuilder() {
-        withLoggingAt(org.apache.log4j.Level.INFO);
-        with(testConfiguration());
-        with(<span class="keyword">new</span> 
DataNucleusPersistenceMechanismInstaller());                        <i 
class="conum" data-value="2"></i><b>(2)</b>
-        withServicesIn( <span class="string"><span 
class="delimiter">"</span><span class="content">domainapp</span><span 
class="delimiter">"</span></span> );                                            
   <i class="conum" data-value="3"></i><b>(3)</b>
-    }
-    <span class="directive">private</span> <span 
class="directive">static</span> IsisConfiguration testConfiguration() {
-        <span class="directive">final</span> IsisConfigurationForJdoIntegTests 
testConfiguration =
-            <span class="keyword">new</span> 
IsisConfigurationForJdoIntegTests();                                 <i 
class="conum" data-value="4"></i><b>(4)</b>
-        testConfiguration.addRegisterEntitiesPackagePrefix(<span 
class="string"><span class="delimiter">"</span><span 
class="content">domainapp.dom.modules</span><span 
class="delimiter">"</span></span>); <i class="conum" 
data-value="5"></i><b>(5)</b>
-        <span class="keyword">return</span> testConfiguration;
-    }
-}</code></pre> 
-           </div> 
-          </div> 
-          <div class="colist arabic"> 
-           <table> 
-            <tbody>
-             <tr> 
-              <td><i class="conum" data-value="1"></i><b>1</b></td> 
-              <td>subclass the framework-provided 
<code>IsisSystemForTest.Builder</code>.</td> 
-             </tr> 
-             <tr> 
-              <td><i class="conum" data-value="2"></i><b>2</b></td> 
-              <td>equivalent to <code>isis.persistor=datanucleus</code> in 
<code>isis.properties</code></td> 
-             </tr> 
-             <tr> 
-              <td><i class="conum" data-value="3"></i><b>3</b></td> 
-              <td>specify the <code>isis.services</code> key in 
<code>isis.properties</code> (where "domainapp" is the base package for all 
classes within the app)</td> 
-             </tr> 
-             <tr> 
-              <td><i class="conum" data-value="4"></i><b>4</b></td> 
-              <td><code>IsisConfigurationForJdoIntegTests</code> has 
pre-canned configuration for using an in-memory HSQLDB and other standard 
settings; more on this below.</td> 
-             </tr> 
-             <tr> 
-              <td><i class="conum" data-value="5"></i><b>5</b></td> 
-              <td>equivalent to 
<code>isis.persistor.datanucleus.RegisterEntities.packagePrefix</code> key 
(typically in <code>persistor_datanucleus.properties</code>)</td> 
-             </tr> 
-            </tbody>
-           </table> 
-          </div> 
-          <div class="paragraph"> 
-           <p>This builder could then be used within the system 
initializer:</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">DomainAppSystemInitializer</span> {
-    <span class="directive">public</span> <span 
class="directive">static</span> <span class="type">void</span> initIsft() {
-        IsisSystemForTest isft = IsisSystemForTest.getElseNull();
-        <span class="keyword">if</span>(isft == <span 
class="predefined-constant">null</span>) {
-            isft = <span class="keyword">new</span> DomainAppSystemBuilder()   
 <i class="conum" data-value="1"></i><b>(1)</b>
-                            .build()
-                            .setUpSystem();
-            IsisSystemForTest.set(isft);           <i class="conum" 
data-value="2"></i><b>(2)</b>
-        }
-    }
-    <span class="directive">private</span> <span 
class="directive">static</span> <span class="type">class</span> <span 
class="class">DomainAppSystemBuilder</span>
-        <span class="directive">extends</span> IsisSystemForTest.Builder { ... 
}
-}</code></pre> 
-           </div> 
-          </div> 
-          <div class="colist arabic"> 
-           <table> 
-            <tbody>
-             <tr> 
-              <td><i class="conum" data-value="1"></i><b>1</b></td> 
-              <td>instantiates and initializes the Apache Isis runtime (the 
<code>IsisSystemForTest</code> class)</td> 
-             </tr> 
-             <tr> 
-              <td><i class="conum" data-value="2"></i><b>2</b></td> 
-              <td>binds the runtime to a thread-local.</td> 
-             </tr> 
-            </tbody>
-           </table> 
-          </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="sect2"> 
@@ -1630,46 +1392,65 @@ CustomerRepository customers;</code></pre>
           </ul>
          </div> 
          <div class="paragraph"> 
-          <p>When writing integration tests, it’s easiest to inherit from a 
base class:</p> 
-         </div> 
-         <div class="ulist"> 
-          <ul> 
-           <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> 
+          <p>When writing integration tests, it’s easiest to inherit from 
the <code>IntegrationTestAbstract3</code> base class.</p> 
          </div> 
          <div class="paragraph"> 
           <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></h4> 
+          <div class="paragraph"> 
+           <p>We recommend that your integration tests inherit from Apache 
Isis' <code>IntegrationTestAbstract3</code> class. The primary benefit over its 
predecessor, <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>(As of <code>1.15.0</code>) we recommend that your integration 
tests inherit from Apache Isis' <code>IntegrationTestAbstract2</code> 
class:</p> 
+           <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> 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> 
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>Although not mandatory, this provides a number of 
helper/convenience methods and JUnit rules:</p> 
+           <p>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="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="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 class="paragraph"> 
+           <p>This test class 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,42 +1479,7 @@ 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> 
-          </div> 
-         </div> 
-         <div class="sect3"> 
-          <h4 
id="__ugtst_integ-test-support_abstract-class_IntegrationTestAbstract">4.3.2. 
<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> 
-          <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> IntegrationTestAbstract {
-    ...
-}</code></pre> 
-           </div> 
-          </div> 
-          <div class="paragraph"> 
-           <p>This provides most of the benefits of 
<code>IntegrationTestAbstract2</code> (it is the latter’s superclass, in 
fact), but the <a 
href="#_ugtst_integ-test-support_bootstrapping">bootstrapping</a> is more 
verbose.</p> 
+           <p>The class also provides a number of injected domain services, 
notably <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> 
@@ -1753,10 +1499,7 @@ CustomerRepository customers;</code></pre>
           <p>The recommended way to run integration tests is against an HSQLDB 
in-memory database. This can be done using the application’s usual <a 
href="../rgcms/rgcms.html#_rgcms_classes_AppManifest-bootstrapping"><code>AppManifest</code></a>,
 and then overriding JDBC URL and similar.</p> 
          </div> 
          <div class="paragraph"> 
-          <p>Different releases of the framework have provided differing ways 
to accomplish this. (As of <code>1.15.0</code>) using 
<code>IntegrationTestAbstract2’s `bootstrapUsing</code> method will make 
these configuration properties as the default. In earlier releases either the 
helper methods in <code>AppManifest.Util</code> class or the 
<code>IsisConfigurationForJdoIntegTests</code> (implementation of 
<code>IsisConfiguration</code>) can be used.</p> 
-         </div> 
-         <div class="paragraph"> 
-          <p>Whichever approach is used, these are the configuration 
properties that will be overridden:</p> 
+          <p>If inheriting from `IntegrationTestAbstract3’s then these 
configuration properties are set up automatically:</p> 
          </div> 
          <table class="tableblock frame-all grid-all spread"> 
           <caption class="title">
@@ -2240,7 +1983,7 @@ Customer customer = 
(Customer)((WrappingObject)wrappedCustomer).__isis_wrapped()
              <td class="icon"> <i class="fa icon-note" title="Note"></i> </td> 
              <td class="content"> 
               <div class="paragraph"> 
-               <p>(As of <code>1.15.0</code>) this can also be done by adding 
a dependency to <code>org.apache.isis.mavendeps:isis-mavendeps-testing</code> 
module; see the <a 
href="../ugfun/ugfun.html#_ugfun_getting-started_simpleapp-archetype">SimpleApp 
archetype</a>.</p> 
+               <p>This can also be done by adding a dependency to 
<code>org.apache.isis.mavendeps:isis-mavendeps-testing</code> module; see the 
<a 
href="../ugfun/ugfun.html#_ugfun_getting-started_simpleapp-archetype">SimpleApp 
archetype</a>.</p> 
               </div> </td> 
             </tr> 
            </tbody>
@@ -2280,7 +2023,7 @@ Customer customer = 
(Customer)((WrappingObject)wrappedCustomer).__isis_wrapped()
              <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 can also be done using 
mavenmixins; see the <a 
href="../ugfun/ugfun.html#_ugfun_getting-started_simpleapp-archetype">SimpleApp 
archetype</a>.</p> 
+               <p>This can also be done using mavenmixins; see the <a 
href="../ugfun/ugfun.html#_ugfun_getting-started_simpleapp-archetype">SimpleApp 
archetype</a>.</p> 
               </div> </td> 
             </tr> 
            </tbody>
@@ -2341,164 +2084,71 @@ Customer customer = 
(Customer)((WrappingObject)wrappedCustomer).__isis_wrapped()
          </div> 
         </div> 
         <div class="sect2"> 
-         <h3 id="_ugtst_bdd-spec-support_key-classes">5.2. Key classes</h3>
+         <h3 id="_ugtst_bdd-spec-support_writing-a-bdd-spec">5.2. 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_key-classes.adoc&quot;";><i
 class="fa fa-pencil-square-o"></i>&nbsp;Edit</button>
+          <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_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>
+           <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>There are some key framework classes that make up the spec 
support; these are discussed below.</p> 
+          <p>BDD specifications contain:</p> 
          </div> 
-         <div class="admonitionblock note"> 
+         <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
+
+  Scenario: Existing simple objects can be listed and <span 
class="keyword">new</span> ones created
+    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">11</span> simple 
objects</code></pre> 
+          </div> 
+         </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 important"> 
           <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> 
+             <td class="icon"> <i class="fa icon-important" 
title="Important"></i> </td> 
+             <td class="content"> 
+              <div class="paragraph"> 
+               <p>BDD specs are assumed to run only as integration tests.</p> 
+              </div> </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> 
-         </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>
-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
-    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> 
-         </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 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"> 
@@ -2508,10 +2158,14 @@ Feature: <span class="predefined-type">List</span> and 
Create New Simple Objects
                 <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> 
@@ -2520,66 +2174,98 @@ Feature: <span class="predefined-type">List</span> and 
Create New Simple Objects
           <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> 
+          <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> 
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);
+           <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="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, <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>
 
+          <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> 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());
+           <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="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>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> 
+          <p>This will only activate for feature files tagged with 
"@DomainAppDemo".</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> 
+          <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">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);
+           <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="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>
@@ -2587,31 +2273,28 @@ Feature: <span class="predefined-type">List</span> and 
Create New Simple Objects
              <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> 
+               <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> 
-        <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 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_maven-configuration">5.5. Maven 
Configuration</h3>
+         <h3 id="_ugtst_bdd-spec-support_maven-configuration">5.3. 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>
@@ -2645,45 +2328,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>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> 
@@ -2735,7 +2406,7 @@ Feature: <span class="predefined-type">List</span> and 
Create New Simple Objects
          <p>Even more significantly, there’s no way to guarantee that the 
data that’s being loaded is logically consistent with the business behaviour 
of the domain objects themselves. That is, there’s nothing to stop your test 
from putting data into the database that would be invalid if one attempted to 
add it through the app.</p> 
         </div> 
         <div class="paragraph"> 
-         <p>The solution that Apache Isis provides is a small library called 
<strong><em>fixture scripts</em></strong>. A fixture script is basically a 
wrapper for executing arbitrary work, but that work almost always invoking a 
business action.</p> 
+         <p>The solution that Apache Isis provides is a small library called 
<strong><em>fixture scripts</em></strong>. A fixture script is basically a 
command object for executing arbitrary work, where the work in question is 
almost always invoking one or more business actions. In other words, the 
database is populating through the functionality of the domain object model 
itself.</p> 
         </div> 
         <div class="admonitionblock tip"> 
          <table> 
@@ -2782,7 +2453,7 @@ Feature: <span class="predefined-type">List</span> and 
Create New Simple Objects
           </ul>
          </div> 
          <div class="paragraph"> 
-          <p>There are two parts to using fixture scripts: the 
<code>FixtureScripts</code> domain service class, and the 
<code>FixtureScript</code> view model class:</p> 
+          <p>There are two main parts to using fixture scripts: the 
<code>FixtureScripts</code> domain service class, and the 
<code>FixtureScript</code> view model class:</p> 
          </div> 
          <div class="ulist"> 
           <ul> 
@@ -2794,35 +2465,39 @@ 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> 
-          <div class="paragraph"> 
-           <p>There are two ways in which you can provide a 
<code>FixtureScripts</code> service.</p> 
-          </div> 
-          <div class="paragraph"> 
-           <p>The original (pre-<code>1.9.0</code>) approach is to subclass 
subclass <code>FixtureScripts</code> domain service, with your subclass 
specifying which package to search for. Various other settings can also be 
provided, and - being a custom class - you can also add in additional actions. 
A common example is to provide a "one-shot" action to recreate a standard demo 
set of objects.</p> 
+          <h4 id="_ugtst_fixture-scripts_api-and-usage_FixtureScripts">6.1.1. 
<code>FixtureScripts</code></h4>
+          <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_FixtureScripts.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_fixture-scripts_api-and-usage_FixtureScripts.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_fixture-scripts_api-and-usage_FixtureScripts.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_fixture-scripts_api-and-usage_FixtureScripts.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_fixture-scripts_api-and-usage_FixtureScripts.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>As of <code>1.9.0</code> there is an alternative design. Instead 
of subclassing <code>FixtureScripts</code> you instead implement the <a 
href="../rgsvc/rgsvc.html#_rgsvc_testing_FixtureScriptsSpecificationProvider"><code>FixtureScriptsSpecificationProvider</code></a>
 SPI. (As its name suggests), this provides a 
<code>FixtureScriptsSpecification</code> object that contains the same 
information as would otherwise have been in the <code>FixtureScripts</code> 
subclass.</p> 
+           <p>The framework provides a default implementation of 
<code>FixtureScripts</code> domain service, namely the <a 
href="../rgsvc/rgsvc.html#_rgsvc_testing_FixtureScripts"><code>FixtureScriptsDefault</code></a>
 domain service. This is annotated to be rendered on the secondary 
"Prototyping" menu.</p> 
           </div> 
           <div class="paragraph"> 
-           <p>The actual implementation of the <code>FixtureScripts</code> 
service is then provided by the framework itself, namely the <a 
href="../rgsvc/rgsvc.html#_rgsvc_testing_FixtureScriptsDefault"><code>FixtureScriptsDefault</code></a>
 domain service, annotated to be rendered on the secondary "Prototyping" menu. 
This uses the <code>FixtureScriptsSpecificationProvider</code> to adjust itself 
accordinly.</p> 
+           <p>The behaviour of this domain menu service can be refined by 
providing an implementation of the optional <a 
href="../rgsvc/rgsvc.html#_rgsvc_testing_FixtureScriptsSpecificationProvider"><code>FixtureScriptsSpecificationProvider</code></a>
 SPI.</p> 
           </div> 
           <div class="paragraph"> 
            <p>For example, here’s the 
<code>FixtureScriptsSpecificationProvider</code> service that’s generated by 
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">@DomainService</span>(nature = NatureOfService.DOMAIN)
-<span class="directive">public</span> <span class="type">class</span> <span 
class="class">DomainAppFixturesProvider</span> <span 
class="directive">implements</span> FixtureScriptsSpecificationProvider {
-    <span class="annotation">@Override</span>
+            <pre class="CodeRay highlight"><code data-lang="java"><span 
class="annotation">@DomainService</span>( nature = NatureOfService.DOMAIN )
+<span class="directive">public</span> <span class="type">class</span> <span 
class="class">DomainAppFixtureScriptsSpecificationProvider</span>
+                    <span class="directive">implements</span> 
FixtureScriptsSpecificationProvider {
     <span class="directive">public</span> FixtureScriptsSpecification 
getSpecification() {
         <span class="keyword">return</span> FixtureScriptsSpecification
-                .builder(DomainAppFixturesProvider.class)                      
                 <i class="conum" data-value="1"></i><b>(1)</b>
-                .with(FixtureScripts.MultipleExecutionStrategy.EXECUTE)        
                 

<TRUNCATED>

Reply via email to