[xwiki-devs] Change to the commons test framework for Mocking Component Test Cases
Hi devs, Over the weekend I've brought one change to xwiki-commons-test. Now by default when you write a unit test that extends AbstractMockingComponentTestCase there will be no component registered against the component manager except those mocked automatically by the @MockingRequirement annotation. This has 2 advantages: * This is the spirit of AbstractMockingComponentTestCase since they're supposed to mock all dependencies and define their behaviors * It makes the tests up to 10 times faster If you really need to register some components, use the {@link ComponentList} annotation and if you really really need to register all components (it takes time) then use {@link AllComponents}. Thanks -Vincent
On Mon, Jul 9, 2012 at 9:32 AM, Vincent Massol <[email protected]> wrote:
Hi devs,
Over the weekend I've brought one change to xwiki-commons-test.
Now by default when you write a unit test that extends AbstractMockingComponentTestCase there will be no component registered against the component manager except those mocked automatically by the @MockingRequirement annotation.
This has 2 advantages: * This is the spirit of AbstractMockingComponentTestCase since they're supposed to mock all dependencies and define their behaviors * It makes the tests up to 10 times faster
If you really need to register some components, use the {@link ComponentList} annotation and if you really really need to register all components (it takes time) then use {@link AllComponents}.
Do we really need to support loading all components in AbstractMockingComponentTestCase since there is AbstractComponentTestCase for that ?
Thanks -Vincent
_______________________________________________ devs mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/devs
-- Thomas Mortagne
On Jul 9, 2012, at 9:38 AM, Thomas Mortagne wrote:
On Mon, Jul 9, 2012 at 9:32 AM, Vincent Massol <[email protected]> wrote:
Hi devs,
Over the weekend I've brought one change to xwiki-commons-test.
Now by default when you write a unit test that extends AbstractMockingComponentTestCase there will be no component registered against the component manager except those mocked automatically by the @MockingRequirement annotation.
This has 2 advantages: * This is the spirit of AbstractMockingComponentTestCase since they're supposed to mock all dependencies and define their behaviors * It makes the tests up to 10 times faster
If you really need to register some components, use the {@link ComponentList} annotation and if you really really need to register all components (it takes time) then use {@link AllComponents}.
Do we really need to support loading all components in AbstractMockingComponentTestCase since there is AbstractComponentTestCase for that ?
I have migrated all tests using AbstractMockingComponentTestCase and if you check the commits you'll see I've used @AllComponents in several places. I started adding the component implementations one by one but when I reached 10 or so I stopped doing it, removed the list and instead used @AllComponents. What this means is that the unit test is not correctly written and it needs to be modified. So yes @AllComponent should not be used in general and once we have fixed existing tests we can remove it. We could revisit existing tests using @AllComponents and instead use @ComponentList even if there are 20 entries in it and then remove @AllComponent. I didn't have the courage to do this yesterday since I already spent a substantial time on this. Also note that AbstractMockingComponentTestCase and AbstractComponentTestCase are for different needs: * AbstractMockingComponentTestCase is for writing unit tests * AbstractComponentTestCase is for writing integration tests Thanks -Vincent
On Mon, Jul 9, 2012 at 10:34 AM, Vincent Massol <[email protected]> wrote:
On Jul 9, 2012, at 9:38 AM, Thomas Mortagne wrote:
On Mon, Jul 9, 2012 at 9:32 AM, Vincent Massol <[email protected]> wrote:
Hi devs,
Over the weekend I've brought one change to xwiki-commons-test.
Now by default when you write a unit test that extends AbstractMockingComponentTestCase there will be no component registered against the component manager except those mocked automatically by the @MockingRequirement annotation.
This has 2 advantages: * This is the spirit of AbstractMockingComponentTestCase since they're supposed to mock all dependencies and define their behaviors * It makes the tests up to 10 times faster
If you really need to register some components, use the {@link ComponentList} annotation and if you really really need to register all components (it takes time) then use {@link AllComponents}.
Do we really need to support loading all components in AbstractMockingComponentTestCase since there is AbstractComponentTestCase for that ?
I have migrated all tests using AbstractMockingComponentTestCase and if you check the commits you'll see I've used @AllComponents in several places. I started adding the component implementations one by one but when I reached 10 or so I stopped doing it, removed the list and instead used @AllComponents.
What this means is that the unit test is not correctly written and it needs to be modified.
So yes @AllComponent should not be used in general and once we have fixed existing tests we can remove it. We could revisit existing tests using @AllComponents and instead use @ComponentList even if there are 20 entries in it and then remove @AllComponent. I didn't have the courage to do this yesterday since I already spent a substantial time on this.
Also note that AbstractMockingComponentTestCase and AbstractComponentTestCase are for different needs: * AbstractMockingComponentTestCase is for writing unit tests * AbstractComponentTestCase is for writing integration tests
The real difference between then is that AbstractComponentTestCase is loading all components which is why I suggested to use it if you need to load all components.
Thanks -Vincent
_______________________________________________ devs mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/devs
-- Thomas Mortagne
On Jul 9, 2012, at 10:56 AM, Thomas Mortagne wrote:
On Mon, Jul 9, 2012 at 10:34 AM, Vincent Massol <[email protected]> wrote:
On Jul 9, 2012, at 9:38 AM, Thomas Mortagne wrote:
On Mon, Jul 9, 2012 at 9:32 AM, Vincent Massol <[email protected]> wrote:
Hi devs,
Over the weekend I've brought one change to xwiki-commons-test.
Now by default when you write a unit test that extends AbstractMockingComponentTestCase there will be no component registered against the component manager except those mocked automatically by the @MockingRequirement annotation.
This has 2 advantages: * This is the spirit of AbstractMockingComponentTestCase since they're supposed to mock all dependencies and define their behaviors * It makes the tests up to 10 times faster
If you really need to register some components, use the {@link ComponentList} annotation and if you really really need to register all components (it takes time) then use {@link AllComponents}.
Do we really need to support loading all components in AbstractMockingComponentTestCase since there is AbstractComponentTestCase for that ?
I have migrated all tests using AbstractMockingComponentTestCase and if you check the commits you'll see I've used @AllComponents in several places. I started adding the component implementations one by one but when I reached 10 or so I stopped doing it, removed the list and instead used @AllComponents.
What this means is that the unit test is not correctly written and it needs to be modified.
So yes @AllComponent should not be used in general and once we have fixed existing tests we can remove it. We could revisit existing tests using @AllComponents and instead use @ComponentList even if there are 20 entries in it and then remove @AllComponent. I didn't have the courage to do this yesterday since I already spent a substantial time on this.
Also note that AbstractMockingComponentTestCase and AbstractComponentTestCase are for different needs: * AbstractMockingComponentTestCase is for writing unit tests * AbstractComponentTestCase is for writing integration tests
The real difference between then is that AbstractComponentTestCase is loading all components which is why I suggested to use it if you need to load all components.
The real difference is the spirit of the test you're writing. One is about unit testing the other about integration testing. And ideally we should be doing a lot more unit tests than integration tests since those are also covered by functional tests (aka smoke tests). Thanks -Vincent
On 07/09/2012 03:32 AM, Vincent Massol wrote:
Hi devs,
Over the weekend I've brought one change to xwiki-commons-test.
Now by default when you write a unit test that extends AbstractMockingComponentTestCase there will be no component registered against the component manager except those mocked automatically by the @MockingRequirement annotation.
This has 2 advantages: * This is the spirit of AbstractMockingComponentTestCase since they're supposed to mock all dependencies and define their behaviors * It makes the tests up to 10 times faster
If you really need to register some components, use the {@link ComponentList} annotation and if you really really need to register all components (it takes time) then use {@link AllComponents}.
Ah, finally. A very good idea, thanks Vincent. -- Sergiu Dumitriu http://purl.org/net/sergiu/
participants (3)
-
Sergiu Dumitriu -
Thomas Mortagne -
Vincent Massol