You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Augusto Rodriguez <Au...@ioko.com> on 2009/11/13 17:00:32 UTC
Testify + TestNG: more than one object marked as @ForComponents
Hi All,
I'm using testify to test my pages, but I can only run one test
successfully and all the other tests, whether they are in another class
or in the same class, fail with the message:
Found more than one object marked as @ForComponents of type
uk.co.test.services.PageInformation
It looks like testify is inserting the mock "pageInformation" two times
in the IoC container.
I don't know if this is related to how I'm using TestNG annotations
and/or using @ForComponent in the parent class. I've tried to play a bit
with the annotations, for example I annotated TestifyBaseTest.suiteSetup
with @BeforeClass, @BeforeTest and @BeforeMethod without success. I've
also tried to move the attributes annotated with @ForComponents to the
subclasses, but it didn't work too. I have copied a bit of my code below
as reference.
Thanks a lot! And sorry for the long email.
Cheers,
Augusto
Base test class:
Public class TestifyBaseTest extends TapestryTest {
private static final TapestryTester SHARED_TESTER = new
TapestryTester("uk.co.test.ux", TestModule.class );
@ForComponents @Mock protected PageURLResolver pageURLResolver;
@ForComponents @Mock protected PageInformation pageInformation;
public TestifyBaseTest() {
super(SHARED_TESTER);
}
@BeforeSuite(alwaysRun=true)
public void suiteSetup() {
tester.injectInto(this);
}
@Override
protected void setUpForAllTestMethods() throws Exception {
MockitoAnnotations.initMocks(this);
}
}
Test:
public class SimpleTest extends TestifyBaseTest {
@BeforeMethod(alwaysRun=true)
public void setup() {
//stub some method calls
}
// this test passes.
@Test(groups="fast")
public void canRenderProgrammeTitle() throws
PageNotFoundException {
Document page = tester.renderPage("test");
}
// this test throws an exception with the message "Found more
than one object marked as @ForComponents of type
uk.co.test.services.TestService".
@Test(groups="fast")
public void canRenderProgrammeTitle() throws
PageNotFoundException {
Document page = tester.renderPage("test");
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org
Re: Testify + TestNG: more than one object marked as @ForComponents
Posted by Paul Field <pa...@db.com>.
You need to be very careful about calling tester.injectInto() yourself
because the superclass TapestryTest is already doing that for you. It
contains this code:
@BeforeClass(alwaysRun=true)
public final void processInjectAnnotation() {
tester.injectInto(this);
}
So I would try removing the suite set-up from your TestifyBaseTest.
Instead create a special class that is a subclass of TestifyBaseTest and
has the suite setup in it and no actual tests. (This is as described in
the documentation:
http://tapestry.formos.com/nightly/tapestry-testify/#TestNG ).
If that doesn't work, let me know and I'll take a more detailed look.
- Paul
Ben Gidley <be...@gidley.co.uk> wrote on 13/11/2009 16:41:56:
> I just fixed this by making the 'TapestryTester' not static. THis
removes
> the issue. However this does seem to defeat some of the point of testify
as
> we now have a lot slower tests are we will be initialising the tester
for
> each test.
> On Fri, Nov 13, 2009 at 4:00 PM, Augusto Rodriguez <
> Augusto.Rodriguez@ioko.com> wrote:
>
> > I'm using testify to test my pages, but I can only run one test
> > successfully and all the other tests, whether they are in another
class
> > or in the same class, fail with the message:
> > Found more than one object marked as @ForComponents of type
> > uk.co.test.services.PageInformation
> >
> >
> > It looks like testify is inserting the mock "pageInformation" two
times
> > in the IoC container.
> >
> > I don't know if this is related to how I'm using TestNG annotations
> > and/or using @ForComponent in the parent class. I've tried to play a
bit
> > with the annotations, for example I annotated
TestifyBaseTest.suiteSetup
> > with @BeforeClass, @BeforeTest and @BeforeMethod without success. I've
> > also tried to move the attributes annotated with @ForComponents to the
> > subclasses, but it didn't work too. I have copied a bit of my code
below
> > as reference.
> >
> >
> > Thanks a lot! And sorry for the long email.
> >
> > Cheers,
> > Augusto
> >
> >
> > Base test class:
> >
> > Public class TestifyBaseTest extends TapestryTest {
> > private static final TapestryTester SHARED_TESTER = new
> > TapestryTester("uk.co.test.ux", TestModule.class );
> >
> > @ForComponents @Mock protected PageURLResolver pageURLResolver;
> > @ForComponents @Mock protected PageInformation pageInformation;
> >
> > public TestifyBaseTest() {
> > super(SHARED_TESTER);
> > }
> >
> > @BeforeSuite(alwaysRun=true)
> > public void suiteSetup() {
> > tester.injectInto(this);
> > }
> >
> > @Override
> > protected void setUpForAllTestMethods() throws Exception {
> > MockitoAnnotations.initMocks(this);
> > }
> > }
> >
> >
> > Test:
> > public class SimpleTest extends TestifyBaseTest {
> >
> > @BeforeMethod(alwaysRun=true)
> > public void setup() {
> > //stub some method calls
> > }
> >
> > // this test passes.
> > @Test(groups="fast")
> > public void canRenderProgrammeTitle() throws
> > PageNotFoundException {
> > Document page = tester.renderPage("test");
> > }
> >
> > // this test throws an exception with the message "Found more
> > than one object marked as @ForComponents of type
> > uk.co.test.services.TestService".
> > @Test(groups="fast")
> > public void canRenderProgrammeTitle() throws
> > PageNotFoundException {
> > Document page = tester.renderPage("test");
> > }
> > }
---
This e-mail may contain confidential and/or privileged information. If you are not the intended recipient (or have received this e-mail in error) please notify the sender immediately and delete this e-mail. Any unauthorized copying, disclosure or distribution of the material in this e-mail is strictly forbidden.
Please refer to http://www.db.com/en/content/eu_disclosures.htm for additional EU corporate and regulatory disclosures.
Re: Testify + TestNG: more than one object marked as @ForComponents
Posted by Ben Gidley <be...@gidley.co.uk>.
Augusto,
I just fixed this by making the 'TapestryTester' not static. THis removes
the issue. However this does seem to defeat some of the point of testify as
we now have a lot slower tests are we will be initialising the tester for
each test.
Ben Gidley
www.gidley.co.uk
ben@gidley.co.uk
On Fri, Nov 13, 2009 at 4:00 PM, Augusto Rodriguez <
Augusto.Rodriguez@ioko.com> wrote:
> Hi All,
>
> I'm using testify to test my pages, but I can only run one test
> successfully and all the other tests, whether they are in another class
> or in the same class, fail with the message:
> Found more than one object marked as @ForComponents of type
> uk.co.test.services.PageInformation
>
>
> It looks like testify is inserting the mock "pageInformation" two times
> in the IoC container.
>
> I don't know if this is related to how I'm using TestNG annotations
> and/or using @ForComponent in the parent class. I've tried to play a bit
> with the annotations, for example I annotated TestifyBaseTest.suiteSetup
> with @BeforeClass, @BeforeTest and @BeforeMethod without success. I've
> also tried to move the attributes annotated with @ForComponents to the
> subclasses, but it didn't work too. I have copied a bit of my code below
> as reference.
>
>
> Thanks a lot! And sorry for the long email.
>
> Cheers,
> Augusto
>
>
> Base test class:
>
> Public class TestifyBaseTest extends TapestryTest {
> private static final TapestryTester SHARED_TESTER = new
> TapestryTester("uk.co.test.ux", TestModule.class );
>
> @ForComponents @Mock protected PageURLResolver pageURLResolver;
> @ForComponents @Mock protected PageInformation pageInformation;
>
> public TestifyBaseTest() {
> super(SHARED_TESTER);
> }
>
> @BeforeSuite(alwaysRun=true)
> public void suiteSetup() {
> tester.injectInto(this);
> }
>
> @Override
> protected void setUpForAllTestMethods() throws Exception {
> MockitoAnnotations.initMocks(this);
> }
> }
>
>
> Test:
> public class SimpleTest extends TestifyBaseTest {
>
> @BeforeMethod(alwaysRun=true)
> public void setup() {
> //stub some method calls
> }
>
> // this test passes.
> @Test(groups="fast")
> public void canRenderProgrammeTitle() throws
> PageNotFoundException {
> Document page = tester.renderPage("test");
> }
>
> // this test throws an exception with the message "Found more
> than one object marked as @ForComponents of type
> uk.co.test.services.TestService".
> @Test(groups="fast")
> public void canRenderProgrammeTitle() throws
> PageNotFoundException {
> Document page = tester.renderPage("test");
> }
> }
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>
>