On Jul 9, 2012, at 10:56 AM, Thomas Mortagne wrote:

> On Mon, Jul 9, 2012 at 10:34 AM, Vincent Massol <vinc...@massol.net> wrote:
>> 
>> On Jul 9, 2012, at 9:38 AM, Thomas Mortagne wrote:
>> 
>>> On Mon, Jul 9, 2012 at 9:32 AM, Vincent Massol <vinc...@massol.net> 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

_______________________________________________
devs mailing list
devs@xwiki.org
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to