The thing that's not working in my tests, is the spin up of Cayenne.
To solve that problem, I tried two things, one worked, the other
didn't.

Let me first explain what I did that worked.

The solution that works, is to copy the model files
(cayenne-Cohort.xml, datamap.map.xml) into the resources directory of
the test files.

src/test/resources/cayenne-Cohort.xml

src/test/resources/datamap.map.xml

I then changed the name of cayenne-Cohort.xml to
cayenne-CohortTest.xml and set a data source on the project to point
to h2 in memory. And the then:

schema-update-strategy="org.apache.cayenne.access.dbsync.CreateIfNoSchemaStrategy"

Then I spin up cayenne with:

runtime = ServerRuntime.builder()
        .addConfig("cayenne-CohortTest.xml")
        .build();


With that configuration I can run my tests successfully.

Obviously, I don't like copying the model file into the test hierarchy
as now anytime you change the model, you have to remember to copy it
and

change its name. Keeping the two in synch is going to be painful. And
I'd rather not do that.


So I tried this next.

Leave the models in the directory where they were.

src/main/resources/cayenne-Cohort.xml

src/main/resources/datamap.map.xml

Add a new cayenne project:

src/test/resources/cayenne-testProject.xml

which only has the definition of the datanode and the data source and
the Schema Update Strategy set to:

schema-update-strategy="org.apache.cayenne.access.dbsync.CreateIfNoSchemaStrategy"

Then I spin up Cayenne with this code:


runtime = ServerRuntime.builder()
        .addConfig("cayenne-Cohort.xml")
        .addConfig("cayenne-testProject.xml")
        .build();

This doesn't work. I get a functional cayenne stack, but the schema
never gets generated, so the SQL fails when it tries to execute.

So my question is, am I twisting Cayenne in ways that aren't supposed
to work, or is this a bug? Or both....

Ok, three questions. :-)

Tony


On Thu, Oct 29, 2020 at 10:50 AM 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