Hi Dharmesh, sorry, never got back to you on this.
On 5 March 2014 09:32, Chohan, Dharmesh <[email protected]> wrote: > Hi Dan > > Another question on integration testing. On the feature file I have added > fixtures to be installed as shown below, > > @TopUpCardDetailsServiceFixture > @CardProductInstanceFixture > @ProductFixture > Feature: List and Create New Top-Ups > > Does the fixture get installed on every scenario test case or just once > for the feature file. > > It depends how you've written the glue. But in the examples we have in the archetypes, its the former. Change the SimpleObjectSpec_listAllAndCreate.feature in the simple archetype to read: @integration Scenario: Existing simple objects can be listed and new ones created Given there are initially 3 simple objects When I create a new simple object Then there are 4 simple objects @integration Scenario: Existing simple objects can be listed and new ones created Given there are initially 3 simple objects When I create a new simple object Then there are 4 simple objects and it still passes. Put a break point in integration.glue.CatalogOfFixturesGlue#integrationFixtures() and you'll see it called for each scenario. > Also is there a way to tear down the fixture after it has run all test > cases. > > I think this is done automatically by the framework. But you could add an @After method (in the CatalogOfFixturesGlue) HTH Dan > Thanks > Dharmesh > > -----Original Message----- > From: Prasad [mailto:[email protected]] > Sent: Monday, March 03, 2014 4:22 PM > To: [email protected] > Subject: Re: Integration testing > > Hi Dan, > > Yes, your explanation helps on understanding the framework. > > Let me collate things related and come back to you further > > Kind Regards, > Prasad. > > > On Mar 3, 2014, at 15:49, Dan Haywood <[email protected]> > wrote: > > > > Hi Prasad, > > > > The proxy wrapper is created using cglib, which works by creating > > (in-memory) a subclass of the proxied class (ie your repository class, > > in this case), and then instantiating it. > > > > Any methods that are final cannot be overridden, so cannot be proxied. > > > > Not sure if that helps you (or me) understand what is going on here > > exactly; but that's how it works. > > > > If you can share some more of your setup code, perhaps we can unravel > > this together? > > > > Thx > > Dan > > > > > > > > > >> On 3 March 2014 15:40, Prasad <[email protected]> > wrote: > >> > >> Hi Dan, > >> > >> I am working on same project with Dharmesh. > >> > >> Regarding point number 1, > >> > >> I have removed the "final" from the method signature to make the code > >> set working(as quick workaround) > >> > >> I am glad to know what impact Isis testing framework brings when we > >> add final in method signature > >> > >> Kind Regards, > >> Prasad. > >> > >>>> On Mar 3, 2014, at 15:24, Dan Haywood > >>>> <[email protected]> > >>> wrote: > >>> > >>> ah well, so long as it's all now working for you, let's leave it at > that. > >>> > >>> Dan > >>> > >>> > >>>> On 3 March 2014 15:22, Chohan, Dharmesh <[email protected]> > >> wrote: > >>>> > >>>> Hi Dan > >>>> > >>>> 1. I am not sure what has changed apart from the method is now > >>>> defined > >> as, > >>>> public List<Card> listAll() { > >>>> return container.allInstances(Card.class); > >>>> } > >>>> > >>>> 2. The problem is fixed, I only see single statement in console > output. > >>>> > >>>> Regards > >>>> Dharmesh > >>>> > >>>> -----Original Message----- > >>>> From: Dan Haywood [mailto:[email protected]] > >>>> Sent: Monday, March 03, 2014 12:26 PM > >>>> To: users > >>>> Subject: Re: Integration testing > >>>> > >>>>> On 3 March 2014 12:09, Chohan, Dharmesh <[email protected]> > >> wrote: > >>>>> > >>>>> Hi Dan > >>>>> > >>>>> 1. The issue has been solved, there was a change in the file. > >>>> > >>>> I'm keen to know a bit more about your fix, cos I'm puzzled what > >> happened > >>>> here originally Can you provide more info? > >>>> > >>>> > >>>> > >>>> 2. I have modified the logging.properties but the console ouput is > >>>> still > >>>>> the same. > >>>> I forgot to say explicitly... there are actually two > >>>> logging.properties files. There's the one in WEB-INF (as used by > >>>> the app), and there's the one in the root directory of the integtest > module. > >>>> > >>>> Did you change both? > >>>> > >>>> Dan > >>>> > >>>> > >>>> > >>>>> Thanks > >>>>> Dharmesh > >>>>> > >>>>> -----Original Message----- > >>>>> From: Dan Haywood [mailto:[email protected]] > >>>>> Sent: Monday, March 03, 2014 11:17 AM > >>>>> To: users > >>>>> Subject: Re: Integration testing > >>>>> > >>>>>> On 3 March 2014 10:49, Chohan, Dharmesh > >>>>>> <[email protected]> > >>>>> wrote: > >>>>> > >>>>>> Hi > >>>>>> > >>>>>> I am running some integration test and I have noticed some > >>>>>> behaviour that I do not understand. > >>>>>> > >>>>>> 1. The following is the output from running the "mvn clean > >>>> install" > >>>>>> command. The test seems to pass but then I am getting the > >>>>>> following > >>>>> error. > >>>>>> This is the method called from the test, > >>>>>> > >>>>>> public final List<Card> listAll() { > >>>>>> return allInstances(Card.class); > >>>>>> } > >>>>>> > >>>>>> 8 Scenarios (8 passed) > >>>>>> 24 Steps (24 passed) > >>>>>> 0m5.731s > >>>>>> > >>>>>> Tests run: 32, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: > >>>>>> 10.852 sec > >>>>>> Running integration.tests.smoke.EnterTopUpDetailsTest > >>>>>> Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: > >>>>>> 0.14 sec <<< FAILURE! > >>>>>> > >>>>>> Results : > >>>>>> > >>>>>> Tests in error: > >>>>>> listAll(integration.tests.smoke.EnterTopUpDetailsTest): Method > >>>>>> 'allInstances' being invoked does not correspond to any of the > >>>>>> object's fields or actions. > >>>>> Hmm, I can explain that message, but I'm not exactly sure how it > >>>>> came to be called. > >>>>> > >>>>> The message is thrown by the wrapped object, so I'm guessing that > >>>>> the repository being called is wrapped. The "listAll" method is > >>>>> called on the wrapping proxy object that then delegates down to > >>>>> the underlying wrapped domain object. > >>>>> > >>>>> What then seems to be happening is that the domain object is > >>>>> somehow (and I can't quite see how) calling allInstances() back on > >>>>> the wrapping > >>>> proxy. > >>>>> > >>>>> Now allInstances is a protected method inherited from > >>>>> AbstractContainedObject, and protected methods are not recognized > >>>>> as actions (they must be public). The proxy is therefore > >>>>> complaining that it can't find this action. > >>>>> > >>>>> The workaround would be to override allInstances in your > >>>>> repository and make it public, or - as you do below - to delegate to > the DOC. > >>>>> But - as I say - I can't quite see how the wrapped domain object > >>>>> ends up calling back on the wrapping proxy. > >>>>> > >>>>> > >>>>> > >>>>> > >>>>>> > >>>>>> In the same class file I am injecting the DomainObjectContainer > >>>>>> object with name container. If I modify the return statement to > >>>>>> the following, then I get a different error. > >>>>>> > >>>>>> public final List<Card> listAll() { > >>>>>> return container.allInstances(Card.class); > >>>>>> } > >>>>>> > >>>>>> 8 Scenarios (1 failed, 7 passed) > >>>>>> 24 Steps (1 failed, 2 skipped, 21 passed) 0m5.221s > >>>>>> > >>>>>> java.lang.NullPointerException > >>>>>> at > >>>>> net.atos.tfgm.services.CardService.listAll(CardService.java:88) > >>>>>> at > >>>>> integration.glue.simple.EnterTopUpDetailsGlue$1.<init>(EnterTopUpD > >>>>> etai > >>>>> lsGlue.java:74) > >>>>>> at > >>>>> integration.glue.simple.EnterTopUpDetailsGlue.There_are_initially_ > >>>>> Smar > >>>>> tis_cards(EnterTopUpDetailsGlue.java:72) > >>>>>> at ?.Given There are initially 3 Smartis > >>>>>> > cards(integration/specs/simple/EnterTopUpDetailsSpec_listAllAndCreate. > >>>>>> feature:28) > >>>>> This looks to me that the container field isn't injected, so its a > >>>>> simple NPE. Since you are inheriting from > >>>>> AbstractContainedObject, use > >>>>> getContainer() instead. > >>>>> > >>>>> > >>>>> > >>>>> > >>>>>> 2. The second issue I have seen in the console output is that > the > >>>>>> fixtures are getting called 3 times for everything, i.e. create > >>>>>> table, inserts and selects. I am not sure if there is something > >>>>>> in configuration file that needs changing? > >>>>>> > >>>>>> 10:40:59,946 [Native main DEBUG] INSERT INTO > >>>>>> "Card" > >>>>>> ("expiryDate","cardId","category","type","cardNumber","status","v > >>>>>> ers > >>>>>> io > >>>>>> n") > >>>>>> VALUES > >>>> (<2014-03-03>,<633597111>,<'ITSO'>,<null>,<'123456789111'>,<'Live'> > >>>> ,<1>) > >>>>>> 10:40:59,946 [Native main DEBUG] INSERT INTO > >>>>>> "Card" > >>>>>> ("expiryDate","cardId","category","type","cardNumber","status","v > >>>>>> ers > >>>>>> io > >>>>>> n") > >>>>>> VALUES > >>>> (<2014-03-03>,<633597111>,<'ITSO'>,<null>,<'123456789111'>,<'Live'> > >>>> ,<1>) > >>>>>> 10:40:59,946 [Native main DEBUG] INSERT INTO > >>>>>> "Card" > >>>>>> ("expiryDate","cardId","category","type","cardNumber","status","v > >>>>>> ers > >>>>>> io > >>>>>> n") > >>>>>> VALUES > >>>> (<2014-03-03>,<633597111>,<'ITSO'>,<null>,<'123456789111'>,<'Live'> > >>>> ,<1>) > >>>>>> 1 > >>>>> It's only called once, it's just that the logging is setup > >>>> incorrectly.... > >>>>> the log4j.additivity clause was missing. > >>>>> > >>>>> Modify your logging.properties for DataNucleus to read: > >>>>> > >>>>> > >>>>> # DataNucleus > >>>>> > >>>>> # these are the two most useful ones # Native shows DML SQL, > >>>>> Schema shows DDL SQL > >>>>> log4j.logger.DataNucleus.Datastore.Native=DEBUG, Console > >>>>> log4j.logger.DataNucleus.Datastore.Schema=DEBUG, Console > >>>>> > >>>>> # typically leave the remainder as WARN or ERROR. > >>>>> log4j.logger.DataNucleus.Persistence=WARN, Console > >>>>> log4j.logger.DataNucleus.Transaction=WARN, Console > >>>>> log4j.logger.DataNucleus.Connection=WARN, Console > >>>>> log4j.logger.DataNucleus.Query=WARN, Console > >>>>> log4j.logger.DataNucleus.Cache=WARN, Console > >>>>> log4j.logger.DataNucleus.MetaData=WARN, Console > >>>>> log4j.logger.DataNucleus.Datastore=WARN, Console > >>>>> log4j.logger.DataNucleus.Datastore.Persist=WARN, Console > >>>>> log4j.logger.DataNucleus.Datastore.Retrieve=WARN, Console > >>>>> log4j.logger.DataNucleus.General=WARN, Console > >>>>> log4j.logger.DataNucleus.Lifecycle=WARN, Console > >>>>> log4j.logger.DataNucleus.ValueGeneration=WARN, Console > >>>>> log4j.logger.DataNucleus.Enhancer=WARN, Console > >>>>> log4j.logger.DataNucleus.SchemaTool=ERROR, Console > >>>>> log4j.logger.DataNucleus.JDO=WARN, Console > >>>>> log4j.logger.DataNucleus.JPA=ERROR, Console > >>>>> log4j.logger.DataNucleus.JCA=WARN, Console > >>>>> log4j.logger.DataNucleus.IDE=ERROR, Console > >>>>> > >>>>> log4j.additivity.DataNucleus.Datastore.Native=false > >>>>> log4j.additivity.DataNucleus.Datastore.Schema=false > >>>>> log4j.additivity.DataNucleus.Datastore.Persistence=false > >>>>> log4j.additivity.DataNucleus.Datastore.Transaction=false > >>>>> log4j.additivity.DataNucleus.Datastore.Connection=false > >>>>> log4j.additivity.DataNucleus.Datastore.Query=false > >>>>> log4j.additivity.DataNucleus.Datastore.Cache=false > >>>>> log4j.additivity.DataNucleus.Datastore.MetaData=false > >>>>> log4j.additivity.DataNucleus.Datastore.Datastore=false > >>>>> log4j.additivity.DataNucleus.Datastore.Datastore.Persist=false > >>>>> log4j.additivity.DataNucleus.Datastore.Datastore.Retrieve=false > >>>>> log4j.additivity.DataNucleus.Datastore.General=false > >>>>> log4j.additivity.DataNucleus.Datastore.Lifecycle=false > >>>>> log4j.additivity.DataNucleus.Datastore.ValueGeneration=false > >>>>> log4j.additivity.DataNucleus.Datastore.Enhancer=false > >>>>> log4j.additivity.DataNucleus.Datastore.SchemaTool=false > >>>>> log4j.additivity.DataNucleus.Datastore.JDO=false > >>>>> log4j.additivity.DataNucleus.Datastore.JPA=false > >>>>> log4j.additivity.DataNucleus.Datastore.JCA=false > >>>>> log4j.additivity.DataNucleus.Datastore.IDE=false > >>>>> > >>>>> > >>>>> > >>>>> and see if that fixes the issue. Hopefully it will, this is the > >>>>> fix going forward in 1.4.0-snapshot and will be in the next > >>>>> archetype we release > >>>>> > >>>>> HTH > >>>>> Dan > >>>>> > >>>>> > >>>>> > >>>>>> Thanks > >>>>>> Dharmesh > >> >
