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

Reply via email to