在我进行单元测试mock
静态类的时候,突然出现了这个异常
我就很懵逼啊,无奈只能一步一步的进去查找问题
结果发现问题出现在静态类当中,那是肯定的,我是mock
了这个使用到静态方法的地方才报错的
首先,是我们的静态类
package com.banmoon.utils;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.banmoon.service.PowerMockitoService;
public final class PowerMockitoUtil {
static {
PowerMockitoService bean = SpringUtil.getBean(PowerMockitoService.class);
bean.finalMethod();
}
public static String staticFinalMethod() {
return RandomUtil.randomString(10);
}
}
再然后,是我们需要单测的方法,这个方法正好使用了这个静态方法
package com.banmoon.service.impl;
import com.banmoon.service.PowerMockitoService;
import com.banmoon.utils.PowerMockitoUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Slf4j
@Service
@RequiredArgsConstructor
public class PowerMockitoServiceImpl implements PowerMockitoService {
@Override
public String execludeStaticCode() {
String str = PowerMockitoUtil.staticFinalMethod();
return "结果:" + str;
}
}
那么我们的单测方法
package com.banmoon.powerMockitoTest;
import com.banmoon.service.impl.PowerMockitoServiceImpl;
import com.banmoon.utils.PowerMockitoUtil;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.powermock.api.mockito.PowerMockito.when;
/**
* @author banmoon
* @date 2024/07/16 20:20:46
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest(PowerMockitoUtil.class)
public class ExcludeStaticCodeTest {
@InjectMocks
private PowerMockitoServiceImpl powerMockitoService;
@Test
public void testExecludeStaticCode() {
// 设置参数
PowerMockito.mockStatic(PowerMockitoUtil.class);
when(PowerMockitoUtil.staticFinalMethod()).thenReturn("mock");
// 运行测试
String string = powerMockitoService.execludeStaticCode();
// 验证结果
Assert.assertEquals("结果:mock", string);
}
}
一执行单测,就报错了,报错截图如下
我们在单测的时候, 不可能为了单测去修改除测试方法以外的代码逻辑的
比如这次的PowerMockitoUtil.java
,当中的静态代码块虽然只是我的模拟。
但它在正常的容器下运行就是正常且必须的
那么我们就得想办法绕过去了,正好PowerMockito
提供了一个注解,可以帮助我们取消静态代码块的执行
@SuppressStaticInitializationFor
,使用如下
package com.banmoon.powerMockitoTest;
import com.banmoon.service.impl.PowerMockitoServiceImpl;
import com.banmoon.utils.PowerMockitoUtil;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.mockito.Mockito.when;
/**
* @author banmoon
* @date 2024/07/16 20:20:46
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest(PowerMockitoUtil.class)
@SuppressStaticInitializationFor("com.banmoon.utils.PowerMockitoUtil")
public class ExcludeStaticCodeTest {
@InjectMocks
private PowerMockitoServiceImpl powerMockitoServiceImplUnderTest;
@Test
public void testExecludeStaticCode() {
// 设置参数
PowerMockito.mockStatic(PowerMockitoUtil.class);
when(PowerMockitoUtil.staticFinalMethod()).thenAnswer(invocation -> "mock");
// 运行测试
String string = powerMockitoServiceImplUnderTest.execludeStaticCode();
// 验证结果
Assert.assertEquals("结果:mock", string);
}
}
在进行code
运行的时候,又出现了一个报错
org.mockito.exceptions.misusing.NotAMockException: Argument should be a mock, but is: class java.lang.Class
后面再检查一下是什么问题
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有