java - 如何将代码从Jmockit 1.1更新到1.9以访问真实实例?

标签 java junit jmockit

我正在尝试将代码从Jmockit 1.1更新到1.9以访问真实实例,但似乎不成功,如下所示:

    java.lang.IllegalArgumentException: Matching real methods not found for the following mocks:
CopyOfAccessRealInstanceTest$1#getRealInstanceName(String m, mockit.Invocation inv)
    at CopyOfAccessRealInstanceTest$1.<init>(CopyOfAccessRealInstanceTest.java:28)
    at CopyOfAccessRealInstanceTest.mockConstructor(CopyOfAccessRealInstanceTest.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

我认为这是由于模拟方法:

        @Mock(invocations = 1)
        public String getRealInstanceName(String m,Invocation inv)

-------------------------代码1.9---------------------------------

public class CopyOfAccessRealInstanceTest {  
    private Constructor constructor = new Constructor("");  

    @Test
    public void mockConstructor() {
        // Mockit.setUpMock(Constructor.class, new MockedConstructor());
        MockUp<Constructor> mockup = new MockUp<Constructor>() {
            //public Constructor it;

            @Mock(invocations = 1)
            public String getRealInstanceName(String m,Invocation inv)
            {           
                if ("real".equals(m)) {
                    return inv.proceed(inv.getInvokedArguments());
                    // return it.getRealInstanceName(m);
                } else {
                    return "mock";
                }
            }
        };

        Assert.assertEquals("mock",
                                constructor.getRealInstanceName(""));
        Assert.assertEquals("real_m_real",
            constructor.getRealInstanceName("real"));
    }
}

--------------------------------Jmock 1.1代码--------------------------------

public class AccessRealInstanceTest {
    private Constructor constructor = new Constructor("");

    @Test
    public void mockConstructor() {
        Mockit.setUpMock(Constructor.class, new MockedConstructor());
        Assert.assertEquals("real_m_real",
                   constructor.getRealInstanceName("real"));
    }

    public static class MockedConstructor {
        public Constructor it;
        @Mock(reentrant = true)//reentrant allow to access real instance
        public String getRealInstanceName(String m) {
            if ("real".equals(m)) {
                return it.getRealInstanceName(m);
            } else {
                return "mock";
            }
        }
    }
}

要模拟的类:

public class Constructor {
    private String memberId;  

    public Constructor(String memberId) {  
        this.memberId = memberId;  
    }  

    public String getRealName() {  
        return "real_" + this.memberId;  
    }  

    public String getRealInstanceName(String m) {
        return "real_m_" + m;
    }
}

最佳答案

已解决。谢谢RogérioSean !

请注意,API 文档指出调用参数必须是模拟方法中的第一个参数。 –Rogério

关于java - 如何将代码从Jmockit 1.1更新到1.9以访问真实实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24463342/

相关文章:

java - 设置 ListView 背景时应用程序崩溃

java - DBUnit 在删除数据集时抛出 NoSuchColumnException

testing - Gradle-Jacoco-JMockit-测试正在挂起而未进行

java - JMockit 与 JUnit5 - JMockit 未初始化

java - Android:如何在不使用 switch 语句的情况下从不同类调用同名函数?

java - 我将如何缩放像素阵列?

java - JUnit IO 测试

java - 在 Junit 中实现 Test 而不是扩展 TestCase [Java]

spring - 如何创建一个模拟(通过 jmockit)的 spring bean?

java - 在java中计算百分比