Site
课程由外部团队提供给我,并且有私有构造函数。
public class Site
{
int id;
String brand;
private Site(int id, String brand)
{
this.id = id;
this.brand = brand;
}
}
SiteUtil类(由团队控制)是
public class SiteUtil
{
public static Site getSite()
{
Site site;
//Logic
return site;
}
}
getSite()
函数应用逻辑的数据需要网络调用,因此需要进行模拟。它目前没有setter(可能与数据源保持一致,不太确定)
我嘲笑如下
Site mockSite = new Site(1,"Google");
PowerMockito.when(SiteUtil.getSite(1)).thenReturn(mockSite);
上面的代码当然是在我使用公共构造函数时编译的。
我读到的解决方案是模拟Site
对象的私有构造函数。然而,我对如何做到这一点感到茫然(第一次写单元测试!)
答案 0 :(得分:6)
假设您的代码仅通过getter访问id
和brand
的值,您可以简单地模拟您的类Site
,然后在调用静态方法时返回此模拟{{ 1}}作为下一个:
SiteUtil.getSite()
答案 1 :(得分:1)
作为一种替代方法,如果您可以让管理层支持您,可以通过兼容方式更改其API。不是在getSite()
方法中隐藏网络查找,而是将它们外部化为SiteLookupStrategy
:
public class SiteUtil {
private static SiteLookupStrategy strategy = new DefaultSiteLookupStrategy();
public static Site getSite(int siteNum) {
return strategy.lookup(siteNum);
}
public static void setLookupStrategy(SiteLookupStrategy strategy) {
SiteUtil.strategy = strategy;
}
}
这样,对于测试,您可以注入自己的(模拟的)策略,但不需要更改代码的现有客户端。 (这也有利于使查找本身更容易测试该组。)