java 如何mock参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 如何mock参数相关的知识,希望对你有一定的参考价值。

package cn.outofmemory.junit.jmockit;

import mockit.NonStrictExpectations;
import mockit.Injectable;
import mockit.MockUp;
import mockit.Mocked;
import mockit.Mockit;
import mockit.NonStrict;
import mockit.Tested;

public class MockTargetTest 

    @BeforeClass
    static public void beforeClass() 
        Mockit.setUpMocks();
    
    @Mocked
    private MockTarget mt;

    @Test
    public void testPrivateMethodMock()        
        new NonStrictExpectations(mt) 
            
                // 对私有方法进行mock  
                this.invoke(mt, "privateMethod", anyString);  
                result = "Hello Object";  
            
        ;

        Object actual = mt.publicMethod();
        assertEquals(actual,"Hello Object");
    

参考技术A 学习一下Easymock,网上搜

单元测试 | 如何在Mock时匹配匿名类型参数

前言

假设,我们需要单元测试如下方法:

public User GetUser(int id)

    return Repository.Query<User>(new  ID = id ).FirstOrDefault();

而对于Repository.Query,我们需要进行Mock。

怎么实现?

不匹配具体参数值

如果我们不关心参数的具体值,可以简单地让它匹配任何object:

mockRepo.Setup(t => t.Query(
 It.IsAny<object>()))
   .Returns(user);

但是,如果要验证具体参数值时,下列方法无法工作:

mockRepo.Setup(t => t.Query(
 new  ID = 1 ))
   .Returns(user);

因为单元测试和实际执行生成的匿名类型分别位于不同的Assembly,不能匹配。

Json序列化

把对象序列化成字符串,比如JSON,利用字符串比较进行匹配:

mockRepo.Setup(t => t.Query(
 It.Is<object>(o => ToJson(o)==ToJson(new  ID = 1 ))))
   .Returns(user);

但是,这种方式不适合多个参数的情况:

new  Name = "My IO", Age = 1 

一旦改变属性声明的顺序,序列化匹配就会失效。

反射

反射匿名类型取出对应属性的值:

mockRepo.Setup(t => t.Query(
 It.Is<object>(o => (int)o.GetType().GetProperty("ID").GetValue(o) == 1)))
   .Returns(user);

这种方式能够实现完全灵活地进行比较,以确定参数是否匹配。但如果有多个属性要匹配,则非常繁琐。

结论

在本文中,我们提供了3种方式,在Mock时匹配匿名类型参数。

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“

以上是关于java 如何mock参数的主要内容,如果未能解决你的问题,请参考以下文章

单元测试 | 如何在Mock时匹配匿名类型参数

如何使用 power mock 模拟将 List 类型作为参数的私有方法? [复制]

java如何mock

java如何mock

java如何mock

如何在Java Unit Test中mock 静态方法