嘲笑私人构造函数

时间:2016-09-26 11:30:25

标签: java powermockito

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对象的私有构造函数。然而,我对如何做到这一点感到茫然(第一次写单元测试!)

2 个答案:

答案 0 :(得分:6)

假设您的代码仅通过getter访问idbrand的值,您可以简单地模拟您的类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;
    }
}

这样,对于测试,您可以注入自己的(模拟的)策略,但不需要更改代码的现有客户端。 (这也有利于使查找本身更容易测试该组。)