使用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
相关产品推荐
相关产品推荐

