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>(EnterTopUpDetai >>>>> 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","vers >>>>>> 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","vers >>>>>> 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","vers >>>>>> 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 >>
