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

Reply via email to