业务方法
@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);
}
}