1- """Mockito mocker implementation.
2-
3- https://mockito-python.readthedocs.io/en/latest/
4- """
1+ """Mockito mocker implementation. https://mockito-python.readthedocs.io/en/latest ."""
52
63from typing import Any , Callable
74
8- import fromconfig # type: ignore[import-untyped] # explicit ignore
95from mockito import ( # type: ignore[import-untyped] # explicit ignore
106 invocation ,
117 mocking ,
2117 R ,
2218 T ,
2319 UiPathMockResponseGenerationError ,
24- UiPathNoMockFoundError ,
2520)
2621
2722
@@ -32,12 +27,50 @@ def __getattr__(self, item):
3227 """Return a wrapper function that raises an exception."""
3328
3429 def func (* _args , ** _kwargs ):
35- """Not Implemented."""
3630 raise NotImplementedError ()
3731
3832 return func
3933
4034
35+ def _resolve_value (config : Any ) -> Any :
36+ # Handle {"_attr_": "mockito.any"}
37+ if isinstance (config , dict ) and "_attr_" in config :
38+ attr = config ["_attr_" ]
39+ if attr == "mockito.any" :
40+ from mockito import any as mockito_any
41+
42+ return mockito_any ()
43+
44+ # Handle {"_target_": "..."}
45+ if isinstance (config , dict ) and "_target_" in config :
46+ target = config ["_target_" ]
47+ module_path , name = target .rsplit ("." , 1 )
48+
49+ import importlib
50+
51+ module = importlib .import_module (module_path )
52+ obj = getattr (module , name )
53+
54+ args = [_resolve_value (v ) for v in config .get ("_args_" , [])]
55+ kwargs = {
56+ k : _resolve_value (v )
57+ for k , v in config .items ()
58+ if k not in ("_target_" , "_args_" )
59+ }
60+ return obj (* args , ** kwargs )
61+
62+ if isinstance (config , dict ):
63+ return {k : _resolve_value (v ) for k , v in config .items ()}
64+
65+ if isinstance (config , list ):
66+ return [_resolve_value (v ) for v in config ]
67+
68+ if isinstance (config , tuple ):
69+ return tuple (_resolve_value (v ) for v in config )
70+
71+ return config
72+
73+
4174class MockitoMocker (Mocker ):
4275 """Mockito Mocker."""
4376
@@ -50,34 +83,54 @@ def __init__(self, evaluation_item: EvaluationItem):
5083 mock_obj = mocking .Mock (self .stub )
5184
5285 for behavior in self .evaluation_item .mocking_strategy .behaviors :
86+ resolved_args = _resolve_value (behavior .arguments .args )
87+ resolved_kwargs = _resolve_value (behavior .arguments .kwargs )
88+
89+ args = resolved_args if resolved_args is not None else []
90+ kwargs = resolved_kwargs if resolved_kwargs is not None else {}
91+
5392 stubbed = invocation .StubbedInvocation (mock_obj , behavior .function )(
54- * fromconfig . fromconfig ( behavior . arguments . args ) ,
55- ** fromconfig . fromconfig ( behavior . arguments . kwargs ) ,
93+ * args ,
94+ ** kwargs ,
5695 )
96+
5797 for answer in behavior .then :
98+ answer_dict = answer .model_dump ()
99+
58100 if answer .type == MockingAnswerType .RETURN :
59- stubbed = stubbed .thenReturn (
60- fromconfig .fromconfig (answer .model_dump ())["value" ]
61- )
101+ stubbed = stubbed .thenReturn (_resolve_value (answer_dict ["value" ]))
102+
62103 elif answer .type == MockingAnswerType .RAISE :
63- stubbed = stubbed .thenRaise (
64- fromconfig .fromconfig (answer .model_dump ())["value" ]
65- )
104+ stubbed = stubbed .thenRaise (_resolve_value (answer_dict ["value" ]))
66105
67106 async def response (
68107 self , func : Callable [[T ], R ], params : dict [str , Any ], * args : T , ** kwargs
69108 ) -> R :
70- """Respond with mocked response."""
109+ """Return mocked response or raise appropriate errors ."""
71110 if not isinstance (
72111 self .evaluation_item .mocking_strategy , MockitoMockingStrategy
73112 ):
74113 raise UiPathMockResponseGenerationError ("Mocking strategy misconfigured." )
75- if not any (
114+
115+ # No behavior configured → call real function
116+ is_mocked = any (
76117 behavior .function == params ["name" ]
77118 for behavior in self .evaluation_item .mocking_strategy .behaviors
78- ):
79- raise UiPathNoMockFoundError ()
119+ )
120+
121+ if not is_mocked :
122+ import inspect
123+
124+ if inspect .iscoroutinefunction (func ):
125+ return await func (* args , ** kwargs )
126+ return func (* args , ** kwargs )
127+
128+ # Behavioral mocking
80129 try :
81130 return getattr (self .stub , params ["name" ])(* args , ** kwargs )
131+
132+ except NotImplementedError :
133+ raise
134+
82135 except Exception as e :
83136 raise UiPathMockResponseGenerationError () from e
0 commit comments