junit单元测试mock私有private方法和静态static方法

这篇具有很好参考价值的文章主要介绍了junit单元测试mock私有private方法和静态static方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我们知道org.mockito.Mockito功能有限,不能mock 私有private、受保护的protected方法

org.powermock.api.mockito.PowerMockito更强大,支持对private和protected和static方法的mock

别忘记,首先要引入maven依赖

      <dependency>
          <groupId>org.powermock</groupId>
          <artifactId>powermock-module-junit4</artifactId>
          <version>2.0.9</version>
          <scope>test</scope>
      </dependency>

      <dependency>
          <groupId>org.powermock</groupId>
          <artifactId>powermock-api-mockito2</artifactId>
          <version>2.0.9</version>
          <scope>test</scope>
      </dependency>

一、mock private方法

有如下私有方法需要mock

	private MessageBo executeExpression(List<Executor> ruleList, Map<String, Object> replaceMap) {
		MessageBo messageBo = new MessageBo();
		messageBo.setFlag(Boolean.TRUE);
		for (Executor rule : ruleList) {
			Bindings bidBindings = getParamValueList(replaceMap, rule.getParam());
			Bindings ret = executeExpression(rule.getCompiledScript(), bidBindings);
			if (Boolean.FALSE.equals(ret.get("0"))) {
				messageBo.setCode((String)ret.get("1"));
				messageBo.setMsg((String)ret.get("2"));
				messageBo.setFlag(Boolean.FALSE);
				break;
			}
		}
		return messageBo;
	}

这时候可以利用PowerMockito的spy方法mock出方法所在的对象,然后利用PowerMockito的when(Object instance, String methodName, Object... arguments),调用方法并传递参数,thenAnswer(Answer<?> answer) mock期望的返回结果

具体代码如下:

public class MockTest extends BaseTests {

	@Test
	public void test() {
		GeneralValidateStrategyImpl generalValidateStrategy = PowerMockito.spy(new GeneralValidateStrategyImpl());
		List<Executor> ruleList = new ArrayList<>();
		Map<String, Object> replaceMap = new HashMap<String, Object>();
		try {
			PowerMockito.when(generalValidateStrategy,"executeExpression",ruleList, replaceMap).thenAnswer((m) -> {
				MessageBo messageBo = new MessageBo();
				messageBo.setFlag(Boolean.TRUE);
				return messageBo;
			});
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

二、mock静态方法

如有如下静态方法getCurrentUser

public class LoginContext {

    public static User getCurrentUser() {
        LoginContext loginContext = get();
        if (loginContext == null) {
            return null;
        }
        return loginContext.getUser();
    }
}

mock如下 ,注意需要再测试类加上@PrepareForTest({LoginContext.class}),注解@PrepareForTest里写的类是静态方法所在的类。文章来源地址https://www.toymoban.com/news/detail-523425.html

@PrepareForTest({LoginContext.class})
public class MyUserTest extends BaseTest {		
        PowerMockito.mockStatic(LoginContext.class);
		PowerMockito.when(LoginContext.getCurrentUser()).thenAnswer((m) -> {
			User user = new User();
			user.setUserName("xxx");
			return user;
		});
}

到了这里,关于junit单元测试mock私有private方法和静态static方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 静态方法 单元测试 springboot+mokito+junit5

    CodecUtils的方法是静态类,使用@InjectMocks不能有用,因为这个注解只能用于非静态的对象。 想要为静态方法写单元测试,可以使用Mockito.mockStatic(Class classToMock)方法,它可以返回一个MockedStatic对象,用于模拟静态方法的调用。 1.导入依赖 2.单元测试 可以参考如下地址,了解如何

    2024年04月25日
    浏览(47)
  • 单元测试junit+mock

    单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。至于“单元”的大小或范围,并没有一个明确的标准,“单元”可以是一个方法、类、功能模块或者子系统。 单元测试通常和白盒测试联系到一起 ,如果单从概念上来讲两者是有区别的,不过我们通

    2024年02月08日
    浏览(68)
  • mockito+junit 单元测试 测试私有方法利用反射去调用提升覆盖率 反射调用时传入参数为 null

    今天公司安排我写单元测试 因为要通过三级认证 公司要求是覆盖率必须达到100% 而在写单元测试的时候 对于是否要测试私有方法一直是一个争议 公司规范 对私有方法也进行测试 代码如下: JudgeUtils 是公司封装的一个工具类 让我们看看 isNull 方法的内部 代码如下: 我现在需

    2024年02月11日
    浏览(48)
  • junit单元测试mock常用写法-springboot与springmvc

    做单元测试时候,经常会mock一些方法,得到期望的返回值,这里记录一下常见的public、private、static方法,以及设计到的内部调用的方法 这里采用maven,引入powermock即可 所有单元测试的测试类都继成BaseTest即可 (1)springboot的示例 (2)springmvc的示例 有如下类需要编写单元测

    2024年02月02日
    浏览(41)
  • PowerMock使用-Mock静态私有方法

    本篇文章将说明如何使用 PowerMock 对静态私有方法进行 Mock 。关于使用 PowerMock 需要引入哪些依赖,请参考PowerMock使用-依赖准备。 被测试类如下所示。 被测试类中有一个静态公共方法 isTrue() ,在 isTrue() 方法中会调用 MockStaticPrivateMethod 的静态私有方法 returnTrue() 。测试程序如

    2024年02月14日
    浏览(29)
  • 非Springboot项目使用powermockito单元测试 mock静态方法和ScriptEngineManager providers.next()...not a subtype报错解决

    使用PowerMockito.mockStatic() 加上@RunWith和@PrepareForTest注释 如果报错下面的错则考虑加上@PowerMockIgnore ERROR StatusLogger Unable to unregister MBeans java.lang.LinkageError: javax/management/MBeanServer(具体如下) 解决:加上@PowerMockIgnore(\\\"javax.management.*) ScriptEngineManager providers.next(): javax.script.ScriptEng

    2024年02月15日
    浏览(42)
  • spring boot 单元测试JUnit5使用Mockito模拟Mock数据调用

    spring boot 单元测试JUnit5使用Mockito模拟Mock数据调用 好大一批新用法,大家静下心来好好看看吧 1. spring boot 使用 Mockito.when().thenReturn()模拟返回值 Mockito 是一种 Java mock 框架,他主要就是用来做 mock 测试的,他可以模拟任何 Spring 管理的 bean、模拟方法的返回值、模拟抛出异常…

    2024年02月15日
    浏览(58)
  • 如何优雅地单元测试 Kotlin/Java 中的 private 方法?

    翻译自 https://medium.com/mindorks/how-to-unit-test-private-methods-in-java-and-kotlin-d3cae49dccd ❓如何单元测试 Kotlin/Java 中的 private 方法❓ 首先,开发者应该测试代码里的 private 私有方法吗? 直接信任这些私有方法,测试到调用它们的公开方法感觉就够了吧。 对于这个争论,每个开发者都会

    2024年02月06日
    浏览(41)
  • Java单元测试之Mock指定方法

    单元测试时,假如你遇到某个内部方法无法正常调用;我们可以使用mock工具去解决,方法如下:

    2024年02月13日
    浏览(44)
  • JUnit 单元测试多线程测试解决方法

    在使用 JUnit 单元测试对多线程测试时子线程没有执行,测试非多线程问题则可以正常执行。 JUnit 运行时会在主线程直接完成后调用 System.exit 退出,不会等待各个线程运行结束。

    2024年02月16日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包