Thanks for the reply Fazlan.

One option is to move the new object creation into a protected method and
override the implementation in a subclass. The con is this will add
additional lines to the class being tested and therefore will have to be
decided whether the effort is useful case by case.

We can use overriding option if the method is being used in multiple
places. But if it has only one usage it is not wise to got for that option
as it will increase the line count and will have a negative impact in
coverage reports.


Thanks & Regards,
Ishara Cooray
Senior Software Engineer
Mobile : +9477 262 9512
WSO2, Inc. | http://wso2.com/
Lean . Enterprise . Middleware

On Tue, Oct 10, 2017 at 9:57 AM, Fazlan Nazeem <fazl...@wso2.com> wrote:

> Hi Ishara,
>
> Please check[1] which discusses this issue in Jacoco.
>
> One option is to move the new object creation into a protected method and
> override the implementation in a subclass. The con is this will add
> additional lines to the class being tested and therefore will have to be
> decided whether the effort is useful case by case.
>
> But if the method being tested is static then there is no way to override
> and hence no way to unit test this without a refactoring effort as I am
> aware of.
>
> We have mixed object creation with business logic in the code you have
> provided. This leads to untestable code.
>
> [1] https://github.com/jacoco/jacoco/issues/51
>
> On Tue, Oct 10, 2017 at 9:31 AM, Ishara Cooray <isha...@wso2.com> wrote:
>
>> Hi,
>>
>> Let's say in a legacy code we have new instance created inside the
>> constructor and it is being used inside methods to be unit tested as below.
>>
>> public boolean updateApi(String apiConfig, String tenantDomain) throws 
>> AxisFault {
>>>     try {
>>>         return restApiAdminStub.updateApiForTenant(qualifiedName, 
>>> apiConfig, tenantDomain);
>>>     } catch (Exception e) {
>>>         throw new AxisFault("Error while updating API in the gateway. " + 
>>> e.getMessage(), e);
>>>     }
>>> }
>>>
>>>
>> Where restApiAdminStub is created within the constructor as below.
>>
>>> public RESTAPIAdminClient(String apiProviderName, String apiName, String 
>>> version) throws AxisFault {
>>>>     this.qualifiedName = apiProviderName + "--" + apiName + ":v" + version;
>>>>     this.qualifiedDefaultApiName = apiProviderName + "--" + apiName;
>>>>     restApiAdminStub = new RestApiAdminStub(null, backendURLl + 
>>>> "RestApiAdmin");
>>>>
>>>> }
>>>>
>>>>
>> One option to mock the new instance is, use PowerMockito.whenNew()
>> But if we use that, we need to annotate the class that is creating the
>> new instance with @PrepareForTest annotation and that leads to remove the
>> @PrepareForTest annotation that we use to annotate Test class. Because of
>> that this test class is getting excluded from jacoco report.
>>
>> Do we have any other solution for this?
>>
>> Thanks & Regards,
>> Ishara Cooray
>> Senior Software Engineer
>> Mobile : +9477 262 9512 <+94%2077%20262%209512>
>> WSO2, Inc. | http://wso2.com/
>> Lean . Enterprise . Middleware
>>
>> _______________________________________________
>> Dev mailing list
>> Dev@wso2.org
>> http://wso2.org/cgi-bin/mailman/listinfo/dev
>>
>>
>
>
> --
> Thanks & Regards,
>
> *Fazlan Nazeem*
> Senior Software Engineer
> WSO2 Inc
> Mobile : +94772338839
> <%2B94%20%280%29%20773%20451194>
> fazl...@wso2.com
>
_______________________________________________
Dev mailing list
Dev@wso2.org
http://wso2.org/cgi-bin/mailman/listinfo/dev

Reply via email to