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. >>> >>>> >>> >>> >>> > >>> >>>