mock方法内容的匿名方法

业务方法

@Override
public void deleteResourceCodesFromResourceFile(List<ResourceDO> resources) {

	redissonLock.lock(new LockCallback<IResultEnum>() {
		@Override
		public String getLockName() {
			return CacheKey.REFRESH_DOMAIN_JSON_STATUS_LOCK_KEY;
		}

		@Override
		public IResultEnum process() {
			// 方法逻辑....
			return DefaultResultEnum.SUCCESS;
		}
	}, 20, TimeUnit.SECONDS);

}

要mock对象redissonLock,但是里面的process方法还是要真实执行,代码如下

/**
 * @author A2001111
 * @date 2024/9/30 13:17
 */
package com.haier.configure.service.impl;

import com.haier.configure.entity.ResourceDO;
import com.haier.configure.mapper.ResourceMapper;
import com.haier.configure.service.LanguageService;
import com.haier.configure.service.OssService;
import com.haier.uo.framework.redisson.lock.LockCallback;
import com.haier.uo.framework.redisson.lock.RedissonLock;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.*;
import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collector;

import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.*;

@MockitoSettings(strictness = Strictness.LENIENT)
class ResourceServiceImplTest<M extends ResourceMapper> {
    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
    private LanguageService languageService;

    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
    private OssService ossService;

    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
    private RedissonLock redissonLock;

    @InjectMocks
    @Spy
    private ResourceServiceImpl resourceServiceImpl;

    @Mock
    private M baseMapper;

    private AutoCloseable mockitoCloseable;

    @BeforeEach
    void setUp() throws Exception {
        mockitoCloseable = MockitoAnnotations.openMocks(this);


    }

    @AfterEach
    void tearDown() throws Exception {
        mockitoCloseable.close();
    }

    @Test
    void test_deleteResourceCodesFromResourceFile_should_void_when_condition() throws Exception {
        // 只有特定参数才返回true
        when(ossService.existFileName("commonDefaultCode_HW_zh-CN.json"))
                .thenAnswer(invocationOnMock->{
                    String filename = invocationOnMock.getArgument(0);
                    return filename.equals("commonDefaultCode_HW_zh-CN.json");
                });
        when(ossService.getResourceFileContent(anyString())).thenReturn("[{\"code\":\"ML_HW_quit-app\",\"text\":\"退出程序\"},{\"code\":\"ML_HW_edit\",\"text\":\"编辑\"},{\"code\":\"ML_HW_about\",\"text\":\"关于\"}]");
        when(ossService.uploadFile(anyString(), anyString())).thenReturn("xxxx");

        // mock方法里面的匿名方法!!!!!!
		// mock方法里面的匿名方法!!!!!!
		// mock方法里面的匿名方法!!!!!!
        when(redissonLock.lock(any(LockCallback.class), anyLong(), any())).thenAnswer(invocation -> {
            LockCallback callback = invocation.getArgument(0);
            return callback.process();
        });

        List<String> languageCodes = new ArrayList<>();
        languageCodes.add("zh-CN");
        when(languageService.getEnableList().stream().map(any(Function.class)).collect(any(Collector.class))).thenReturn(languageCodes);

        List<ResourceDO> resources = new ArrayList<>();
        ResourceDO resourceDO = new ResourceDO();
        resourceDO.setDomainCode("commonDefaultCode");
        resourceDO.setModuleCode("HW");
        resourceDO.setCode("ML_HW_quit-app");
        resourceDO.setResourceType(0);
        resources.add(resourceDO);

        // run the test
        resourceServiceImpl.deleteResourceCodesFromResourceFile(resources);

    }

}

JMockit提供了一种方法来模拟私有静态方法的调用。这可以通过使用JMockit的Deencapsulation工具类来实现。Deencapsulation类提供了访问和修改私有属性,调用私有方法的功能。可以使用Deencapsulation.invokeStatic()方法来调用私有静态方法。 在给定的例子中,可以看到在测试方法中,使用了Expectations的匿名内部类来模拟私有静态方法的调用。具体来说,使用new Expectations(MethodClass.class)来模拟MethodClass类的行为。然后在匿名内部类的构造函数中,使用Deencapsulation.invokeStatic()方法来调用私有静态方法init()。这样就实现了对私有静态方法的模拟调用。 总结来说,要在JMockit中模拟私有静态方法的调用,可以使用Deencapsulation.invokeStatic()方法,并且通过创建Expectations的匿名内部类来实现模拟。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [JMockit Mock 私有方法和私有属性](https://blog.csdn.net/tangtao_xp/article/details/105041465)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Jmockit 静态方法mock](https://blog.csdn.net/weixin_48289706/article/details/127448056)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Iam傅红雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值