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

Reply via email to