You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用new MockUp<Hello>匹配不到真实方法,JUnit测试求助

解决JMockit MockUp无法匹配方法的问题

你的问题核心是**@Tested实例的创建时机早于MockUp的初始化**:@Tested会在测试方法执行前就实例化真实的Hello对象,而你在测试方法内部才创建MockUp,此时已存在的实例不会被MockUp修改,调用的仍是原方法;同时MockUp的@Mock方法因未匹配到实际调用,触发"Matching real methods not found"提示。

以下是三种可行的解决方案:

方案1:直接使用MockUp的getMockInstance()获取Mock实例

放弃@Tested注解,通过MockUp的getMockInstance()方法直接获取被修改后的实例,确保实例与MockUp绑定:

@RunWith(JMockit.class)
public class HelloTest {

    @Test
    public void myOwnTest() {
        Hello mock = new MockUp<Hello>() {
            @Mock
            public String sayHello() {
                return "Mock hello world...!";
            }
        }.getMockInstance();

        String res = mock.sayHello();
        org.junit.Assert.assertEquals("Mock hello world...!", res);
    }
}

方案2:使用@Mocked注解简化Mock(推荐)

用JMockit的@Mocked注解标记需要Mock的类,配合Expectations录制行为,写法更简洁:

@RunWith(JMockit.class)
public class HelloTest {

    @Mocked
    Hello mock;

    @Test
    public void myOwnTest() {
        new Expectations() {{
            mock.sayHello();
            result = "Mock hello world...!";
        }};

        String res = mock.sayHello();
        org.junit.Assert.assertEquals("Mock hello world...!", res);
    }
}

方案3:调整MockUp初始化时机(适配@Tested)

如果必须保留@Tested,将MockUp的创建移到@Before方法中,确保在@Tested实例初始化前生效:

@RunWith(JMockit.class)
public class HelloTest {

    @Tested
    Hello mock;

    @Before
    public void setUp() {
        new MockUp<Hello>() {
            @Mock
            public String sayHello() {
                return "Mock hello world...!";
            }
        };
    }

    @Test
    public void myOwnTest() {
        String res = mock.sayHello();
        org.junit.Assert.assertEquals("Mock hello world...!", res);
    }
}

内容的提问来源于stack exchange,提问作者Hector

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 06:20:28