栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java类静态方法的mock实现

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java类静态方法的mock实现

Mockito 3.4.0

mock常见静态方法

待测试类:

package com.taobao.vip.shop.biz.sqyk.manager;

import com.taobao.vip.shop.biz.sqyk.util.TairUtil;


@Slf4j
@Component
public class SqykChannelBenefitManager {
    public static final int BLACK_USER_TAIR_NAME_SPACE = 132;
    
    @Resource
    private TairManager blackUserTairManager;

    
    public boolean isInWinPeriod(String tairKey) {
        String value = TairUtil.get(blackUserTairManager, BLACK_USER_TAIR_NAME_SPACE, tairKey);
        return StringUtils.isNotEmpty(value);
    }

}

测试方法:

package com.taobao.vip.shop.biz.sqyk.manager;


@RunWith(MockitoJUnitRunner.class)
public class SqykChannelBenefitManagerTest extends TestCase {

    @InjectMocks
    private SqykChannelBenefitManager sqykChannelBenefitManager;

    @Mock
    private TairManager blackUserTairManager;

    @Before
    public void setup() throws NoSuchFieldException, IllegalAccessException {
        MockitoAnnotations.openMocks(this);
    }
    
    
    @Test
    public void isInWinPeriod_normalTest() {
        try (MockedStatic theMock = Mockito.mockStatic(TairUtil.class)) {
            theMock.when(() -> TairUtil.get(blackUserTairManager, 132, "key")).thenReturn("hadWin");

            boolean res = sqykChannelBenefitManager.isInWinPeriod("key");
            Assert.assertTrue(res);
        }
    }

    @Test
    public void isInWinPeriod_nullTest() {
        try (MockedStatic theMock = Mockito.mockStatic(TairUtil.class)) {
            theMock.when(() -> TairUtil.get(blackUserTairManager, 132, "key")).thenReturn(null);

            boolean res = sqykChannelBenefitManager.isInWinPeriod("key");
            Assert.assertFalse(res);
        }
    }
}

注意:上面TairUtil方法调用时传入的具体参数值,也可以使用Mockito.any形式进行替换。如果设置了具体参数,则仅能对具体参数的执行过程进行mock。

PowerMock

mock静态方法(带static代码块的类):
    PowerMock 抑制运行静态块:PowerMock 抑制运行静态块_千里之行始于足下-CSDN博客_powermock 抑制
  1. ProwerMock mock静态方法时,when...doReturn存在的bug:= 2.26.1 · Issue #992 · powermock/powermock · GitHub">Static mocking broken for Mockito >= 2.26.1 · Issue #992 · powermock/powermock · GitHub
  2. bug使用when...doAnswer解决:android - org.mockito.exceptions.misusing.NotAMockException: Argument should be a mock, but is: class java.lang.Class for Andriod SSLContext.getInstance() metho - Stack Overflow

待测试类:

package com.taobao.vip.shop.biz.sqyk.domain.packageshow;

public class SqykPackageShowConfig {
    
    private static Properties commonProperties;
    
    private static Map> cardClassIndex = Maps.newHashMap();
    
    // 类中存在静态代码块
    static {
        DiamondUtils.subscribe(BENEFIT_DATA_ID, GROUP_ID, x -> {
            if (StringUtils.isBlank(x)) {
                benefits = Lists.newArrayList();
            } else {
                benefits = JSON.parseArray(x, SqykBenefitInfoWithClass.class);
                buildIndex(benefits);
            }
        });

        DiamondUtils.subscribeByProperties(COMMON_DATA_ID, GROUP_ID, x -> {
            if (x == null) {
                commonProperties = new Properties();
            } else {
                commonProperties = x;
            }
        });
    }

    // 待测试静态方法
    public static List getBenefitsByCardClass(String cardClass) {
        List result = cardClassIndex.get(cardClass);
        return result == null ? new ArrayList<>(0) : result;
    }
}

测试方法:

package com.taobao.vip.shop.biz.sqyk.packageBenefit;

@RunWith(PowerMockRunner.class)
@PrepareForTest({SqykPackageShowConfig.class})
@SuppressStaticInitializationFor("com.taobao.vip.shop.biz.sqyk.domain.packageshow.SqykPackageShowConfig")
public class PackageBenefitonActionCheckHandlerTest {
    private static final Long mockUserId=2210634737969L;
    private static final String mockLifeCycle="20210826-20210925";
    private static final String mockPackageName="crowd_pinHigh_taoLow_V6";
    private static final String mockBenefitCode="532e17d03653424893697dce7a60a21fxxxxxxx";
    private static final Long mockIssueRecordId= 12345678L;
    private static final String mockStrategyCode="42aff94fff074f3099836e0c844b25b0xxxxx";

    @Before
    public void setup() {
        MockitoAnnotations.openMocks(this);
    }

    @Test
    public void mockSqykPackageShowConfigGetBenefitsByCardClass(){
        List list = Lists.newArrayList();
        SqykBenefitInfoWithClass sqykBenefitInfoWithClass = new SqykBenefitInfoWithClass();
        sqykBenefitInfoWithClass.setBenefitCode(mockBenefitCode);
        sqykBenefitInfoWithClass.setBenefitClass("highValue");
        sqykBenefitInfoWithClass.setCardClass(mockPackageName);
        sqykBenefitInfoWithClass.setStrategyCode(mockStrategyCode);
        list.add(sqykBenefitInfoWithClass);
        
        // mockito无法mock带有static静态方法块的类
        //  try (MockedStatic theMock = Mockito.mockStatic(SqykPackageShowConfig.class)) {
        //     theMock.when(()->SqykPackageShowConfig.getBenefitsByCardClass(mockPackageName)).thenReturn(list);
        //  }
        
        
        PowerMockito.mockStatic(SqykPackageShowConfig.class);
        PowerMockito.when(SqykPackageShowConfig.getBenefitsByCardClass(mockPackageName)).thenAnswer(t -> list);
        List resultList = SqykPackageShowConfig.getBenefitsByCardClass(mockPackageName);
        Assert.assertNotNull(resultList);
    }
}

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/727817.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号