Mockito 5.4.0如何Mock带参数静态方法并返回参数属性
如何用Mockito 5.4.0 Mock带参数的静态方法并返回参数属性值?
你需要调整Mock的写法,用thenAnswer来动态获取传入的参数并返回其属性值,同时注意参数匹配器的正确使用,以下是完整实现:
正确的测试代码
import org.junit.jupiter.api.Test; import org.mockito.Mockito; import static org.mockito.ArgumentMatchers.any; public class MyClassTest { @Test void testStaticMethodMock() { // 使用try-with-resources确保静态Mock在测试结束后自动关闭,避免污染其他测试 try (var mockedStatic = Mockito.mockStatic(MyClass.class)) { // 配置静态方法的Mock逻辑:传入任意TestObject,返回其test属性 mockedStatic.when(() -> MyClass.staticMethod(any(TestObject.class))) .thenAnswer(invocation -> { // 获取方法调用时传入的第一个参数 TestObject obj = invocation.getArgument(0); return obj.test(); }); // 验证效果 var testObj = new TestObject("someTest"); var res = MyClass.staticMethod(testObj); System.out.println(res); // 输出:someTest } } }
关键说明
- 静态Mock的作用域:必须把
mockStatic放在try-with-resources块中,这样Mock会在代码块执行完毕后自动释放,防止影响其他测试用例中的静态方法行为。 - 参数匹配器:原代码中
any()未指定类型,Mockito可能无法正确匹配方法签名,改为any(TestObject.class)明确匹配参数类型。 - 动态返回值:如果需要根据传入的参数返回不同结果,不能用
thenReturn(仅支持固定值),而是用thenAnswer,通过InvocationOnMock获取调用时的参数,再提取所需属性返回。
内容的提问来源于stack exchange,提问作者Darkin Rall
相关产品推荐
相关产品推荐

