> Because it's included in a bootique app, we can't use Bootique to do the
> testing here. 

You'd be adding Bootique dependencies to the test scope only, so none of it 
should leak to the modules that include your .jar. But there is a Bootique-free 
solution as well. See below.

> So any ideas about what might be going wrong here?


>> runtime = ServerRuntime.builder()
>>      .addConfig("cayenne-CohortManager.xml")
>>      .addModule(binder -> {
>>          ServerModule.contributeProperties(binder)
>>                  .put("cayenne.jdbc.driver", "org.h2.Driver")
>>                  .put("cayenne.jdbc.url", "jdbc:h2:mem:CohortDB");
>>      })
>>      .build();

Overriding connection properties affects a pre-existing DataNode. It won't 
create a new one. But using explicit ServerRuntimeBuilder API would result in 
creation of a so-called "synthetic" DataNode behind the scenes. So rewrite the 
above as follows:

runtime = ServerRuntime.builder()
     .addConfig("cayenne-CohortManager.xml")
     .jdbcDriver("org.h2.Driver")
     .url("jdbc:h2:mem:CohortDB")
     .build();

and this should produce a working stack.

Andrus


> On Oct 29, 2020, at 5:50 PM, Tony Giaccone <t...@giaccone.org> wrote:
> 
> Andrus, we're using Bootique, but this portion of the code is in it's own
> jar file, it's just the model and some basic services on the objects.
> Because it's included in a bootique app, we can't use Bootique to do the
> testing here. It needs to be just Cayenne. So any ideas about what might be
> going wrong here?
> 
> 
> Tony
> 
> On Thu, Oct 29, 2020 at 1:56 AM Andrus Adamchik <and...@objectstyle.org>
> wrote:
> 
>> And while we are at it, I absolutely must plug a mention of Bootique 2.0 /
>> JUnit 5 testing facilities :)
>> 
>> https://bootique.io/docs/2.x/bootique-docs/#_testing
>> https://bootique.io/docs/2.x/bootique-jdbc-docs/#jdbc-testing
>> 
>> They are on a totally different level:
>> 
>> * Support for Docker/Testcontainers, so you'd test against a real DB, not
>> Derby or H2
>> * Liquibase migrations in tests, so you can use a real up-to-date schema
>> * "Global" scope for test databases and "apps", so you can share them
>> across test classes, improving performance
>> * Improved "Table" API for datatsets preparation and data assertions
>> 
>> Andrus
>> 
>> 
>>> On Oct 29, 2020, at 8:48 AM, Andrus Adamchik <and...@objectstyle.org>
>> wrote:
>>> 
>>> You can still start a BQRuntime in tests, even if the module doesn't use
>> Bootique. Then you'd define a DataSource within BQRuntime, and
>> "bootique-cayenne" would create a DataNode for it automatically and
>> transparently. YMMV with older Bootique versions. E.g. Agrest (that has no
>> Bootique dependency itself) is using Bootique for tests.
>>> 
>>> Andrus
>>> 
>>>> On Oct 29, 2020, at 7:27 AM, Tony Giaccone <t...@giaccone.org> wrote:
>>>> 
>>>> This is what I have now for the spin up:
>>>> 
>>>> runtime = ServerRuntime.builder()
>>>>      .addConfig("cayenne-PriceIncrease.xml")
>>>>      .addModule(binder -> {
>>>>          ServerModule.contributeProperties(binder)
>>>>                  .put("cayenne.jdbc.driver", "org.h2.Driver")
>>>>                  .put("cayenne.jdbc.url", "jdbc:h2:mem:CohortDB");
>>>>      })
>>>>      .build();
>>>> DataNode node = new DataNode("testNode");
>>>> runtime.getDataDomain().setDefaultNode(node);
>>>> 
>>>> 
>>>> And now on commit changes I get this:
>>>> 
>>>> 
>>>> Caused by: java.lang.NullPointerException
>>>> at
>>>> 
>> org.apache.cayenne.access.DataDomainInsertBucket.createPermIds(DataDomainInsertBucket.java:103)
>>>> at
>>>> 
>> org.apache.cayenne.access.DataDomainInsertBucket.appendQueriesInternal(DataDomainInsertBucket.java:73)
>>>> at
>>>> 
>> org.apache.cayenne.access.DataDomainSyncBucket.appendQueries(DataDomainSyncBucket.java:78)
>>>> at
>>>> 
>> org.apache.cayenne.access.DataDomainFlushAction.preprocess(DataDomainFlushAction.java:185)
>>>> at
>>>> 
>> org.apache.cayenne.access.DataDomainFlushAction.flush(DataDomainFlushAction.java:143)
>>>> 
>>>> 
>>>> 
>>>> On Wed, Oct 28, 2020 at 4:08 PM John Huss <johnth...@gmail.com> wrote:
>>>> 
>>>>> You could add a node at runtime:
>>>>> 
>>>>> DataNode node = *new* DataNode("node");
>>>>> 
>>>>> ... // configure node
>>>>> 
>>>>> runtime.getDataDomain().addNode(node);
>>>>> 
>>>>> runtime.getDataDomain().setDefaultNode(node);
>>>>> 
>>>>> On Wed, Oct 28, 2020 at 2:52 PM Tony Giaccone <t...@giaccone.org>
>> wrote:
>>>>> 
>>>>>> So I have a project which is running in Bootique, but the data model
>> is
>>>>>> used in several different apps. To facilitate this, we created a jar
>> file
>>>>>> that includes the generated classes, and the code and the
>>>>>> cayenne-project.xml file in one jar file.  The result of this is tests
>>>>> run
>>>>>> for this jar, don't have access to the bootique runtime, as they are
>> part
>>>>>> of a jar that's going to be included in other apps.
>>>>>> 
>>>>>> We're using an older version of Bootique and so the version of
>> Cayenne is
>>>>>> 4.0.B2
>>>>>> 
>>>>>> The cayenne project, only has a datamap there is no datanode defined
>> in
>>>>> the
>>>>>> xml.
>>>>>> 
>>>>>> So I'm trying to spin up a cayenne runtime, using this code.
>>>>>> 
>>>>>> runtime = ServerRuntime.builder()
>>>>>>      .addConfig("cayenne-CohortManager.xml")
>>>>>>      .addModule(binder -> {
>>>>>>          ServerModule.contributeProperties(binder)
>>>>>>                  .put("cayenne.jdbc.driver", "org.h2.Driver")
>>>>>>                  .put("cayenne.jdbc.url", "jdbc:h2:mem:CohortDB");
>>>>>>      })
>>>>>>      .build();
>>>>>> 
>>>>>> 
>>>>>> The problem is that later, when I try to commit changes, I get this
>>>>> error:
>>>>>> 
>>>>>> org.apache.cayenne.CayenneRuntimeException: [v.4.0.B2 Sep 26 2017
>>>>>> 10:05:06] No DataNode configured for DataMap 'datamap' and no default
>>>>>> DataNode set
>>>>>> 
>>>>>> I'm successfully able to run other tests, because they never do a
>>>>>> commitobjects.
>>>>>> 
>>>>>> 
>>>>>> Any suggestions on how to resolve my problem.
>>>>>> 
>>>>> 
>>> 
>> 
>> 

Reply via email to