Andrus, once again you've quickly pointed me in the right direction, thank
you so much.  I will add that the default behavior of the code you gave me
doesn't automatically create the database schema.

So I had to add the following...

runtime.getDataDomain().getDefaultNode().setSchemaUpdateStrategy(new
CreateIfNoSchemaStrategy());


And with that, all was right with the cayenne stack, it successful
spun up and created the schema and the tests all passed, (well once I
fixed the bugs).

Obviously, I'd prefer to update the code to use a more modern version
of Bootique. Maybe we'll get to that next year.


Tony Giaccone


On Thu, Oct 29, 2020 at 1:08 PM Tony Giaccone <t...@giaccone.org> wrote:

> 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