JMokit中的@Mocked与@Injectable区别

本文详细解析了JMokit框架中的@Mocked与@Injectable注解的区别及其应用场景。通过具体示例阐述了这两个注解如何用于创建mock对象,以及它们在类成员和测试用例参数上的不同效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JMokit中的@Mocked与@Injectable区别

官方Tutorials:http://jmockit.org/gettingStarted.html#mockObject

首先,两个注解都可用于测试类成员mock field与参数用例参数mock parameter,对mock field的注解作用于整个测试类,而对mock parameter的注解只针对该测试用例

@Mocked与@Injectable的区别:前者针对类型,后者针对单个实例

有一个类ToBeMocked,具备一个public方法fun()

public Class ToBeMocked
{
    public String fun()
    {
         return "call original method";
    }   
}

以下分为四种情况讨论

  • @Mocked作用于测试类成员

整个测试类中被mock的类型的所有实例都将被mocked,被mocked的类所有非private方法都将处于mocked状态,被mocked的方法默认返回值null

public class MockedAndInjectableTest1
{
    @Mocked
    ToBeMocked instance;

    @Test
    public void test()
    {
        System.out.println(instance.fun()); //null

        ToBeMocked newInstance = new ToBeMocked();
        System.out.println(newInstance.fun()); //null
    }
}
  • @Mocked作用于测试用例参数

该用例参数中被注解的类型将处于mock状态

public class MockedAndInjectableTest
{
    @Test
    public void test1(@Mocked final ToBeMocked instance)
    {
        System.out.println(instance.fun()); //null

        ToBeMocked newInstance = new ToBeMocked();
        System.out.println(newInstance.fun()); //null
    }

    @Test
    public void test2()
    {
        ToBeMocked newInstance = new ToBeMocked();
        System.out.println(newInstance.fun()); //call original method
    }
}
  • @Injectable作用于测试类成员

被注解的单个实例在整个测试类中将处于mocked状态

public class MockedAndInjectableTest
{
    @Injectable
    ToBeMocked instance;

    @Test
    public void test()
    {
        System.out.println(instance.fun()); //null

        ToBeMocked newInstance = new ToBeMocked();
        System.out.println(newInstance.fun()); //call original method
    }
}
  • @Injectable作用于测试类参数

被注解的单个实例在该测试用例中将处于mocked状态

public class MockedAndInjectableTest
{
    @Test
    public void test1(@Injectable final ToBeMocked instanceA)
    {
        System.out.println(instanceA.fun()); //null

        ToBeMocked newInstance = new ToBeMocked();
        System.out.println(newInstance.fun()); //call original method
    }

    @Test
    public void test2()
    {
        ToBeMocked newInstance = new ToBeMocked();
        System.out.println(newInstance.fun()); //call original method
    }
}

### Python `@patch` 装饰器详解 在单元测试过程中,有时需要模拟某些对象的行为而不实际执行它们。这可以通过使用 `unittest.mock.patch` 实现。此工具允许临时替换类或对象以便更好地控制测试条件。 #### 使用方法 要应用 `@patch` 装饰器,通常会指定目标模块中的属性路径作为参数传递给它。该装饰器可以用于函数、方法或是整个类级别的测试案例上。当应用于特定的方法时,可以在签名中添加额外的参数来接收 mock 对象实例[^1]。 ```python from unittest import TestCase from unittest.mock import patch class TestExample(TestCase): @patch('module.ClassName') def test_method(self, MockClass): instance = MockClass.return_value instance.method.return_value = 'mocked result' # 测试逻辑... ``` 上述例子展示了如何通过 `@patch` 来替代某个类,并设置其行为以适应测试需求。注意这里假设 `'module.ClassName'` 是待替换成 mock 版本的目标类全限定名。 #### 参数说明 - **target**: 需要被补丁的对象的位置;通常是字符串形式表示的导入路径。 - **new**: 如果提供,则用作补丁的内容,默认情况下创建一个新的 MagicMock。 - **spec / spec_set**: 设置为 True 或者是要模仿的具体对象/集合,使得 mock 更加严格遵循原对象接口。 - **autospec**: 类似于 spec 选项但是更加强大,自动生成详细的规格描述。 - **new_callable**: 定义用来制造新 mock 的工厂函数,比如 lambda 表达式或其他可调用实体。 #### 示例代码片段 下面是一个具体的例子,展示怎样利用 `@patch` 修改外部 API 请求的结果: ```python import requests from unittest.mock import patch def fetch_data(): response = requests.get("http://api.example.com/data") return response.json() @patch('requests.get') def test_fetch_data(mock_get): # 构造假数据 fake_response = {"key": "value"} mock_get.return_value.json.return_value = fake_response # 断言请求 URL 正确无误 assert fetch_data() == fake_response ``` 在这个场景下,真实网络请求被阻止了,取而代之的是由我们自己构建的数据结构,从而确保即使没有互联网连接也能稳定运行这些测试用例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值