The Site
class is provided to me by an external team and has a private constructor.
public class Site
{
int id;
String brand;
private Site(int id, String brand)
{
this.id = id;
this.brand = brand;
}
}
The SiteUtil class (controlled by team) is
public class SiteUtil
{
public static Site getSite()
{
Site site;
//Logic
return site;
}
}
The data the getSite()
function applies it logic on requires a network call, therefore it needs to be mocked. It doesn't have a setter currently (maybe to maintain consistency with the data source, not so sure)
I mock it as follows
Site mockSite = new Site(1,"Google");
PowerMockito.when(SiteUtil.getSite(1)).thenReturn(mockSite);
The code above of course dosent compile as I use the public constructor.
The solution I read was to mock the private constructor of Site
object. I'm however at a loss on how to do that (First time writing unit tests!)
Assuming that your code accesses to the value of
id
andbrand
only through getters, you could simply mock your classSite
then return this mock when you call the static methodSiteUtil.getSite()
as next:As an alternate approach, there's a way to compatibly alter their API if you can get management to back you. Instead of hiding the network lookups in the
getSite()
method, externalize them into aSiteLookupStrategy
:This way, for testing, you could inject your own (mocked) strategy, but existing clients of the code would not need to be changed. (This also has the advantage of making the lookup itself easier to test for that group.)