> 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 <[email protected]> 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 <[email protected]>
> 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 <[email protected]>
>> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]>
>> 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.
>>>>>>
>>>>>
>>>
>>
>>