如何使用JMockit MockUp作为默认接口方法

时间:2016-07-13 16:08:43

标签: jmockit

尝试在Java 8默认接口方法上应用MockUp,JMockit告诉我无法找到方法。已经尝试使用JMockit 1.15,1.19和1.25。这是一个非常简单的用例:

@RunWith(JMockit.class)
public class TestTest {

    public interface MyInterface {
        default void foo(int f) {
            bar(String.valueOf(f));
        }

        void bar(String s);
    }

    public class MyClass implements MyInterface {
        public void bar(String s) {
            System.out.println(s);
        }
    }

    @Test
    public void testtest() throws Exception {
        new MockUp<MyClass>() {
            @Mock
            void foo(int i) {
                System.out.println("MOCKMOCK " + (i*2));
            }

            @Mock
            void bar(String s) {
                System.out.println("MOCK " + s);
            }
        };

        MyClass baz = new MyClass();

        baz.foo(5);
        baz.bar("Hello world");
    }

}

这让我错误

java.lang.IllegalArgumentException: Matching real methods not found for the following mocks:
com.example.dcsohl.TestTest$1#foo(int)
    at com.example.dcsohl.TestTest$1.<init>(TestTest.java:29)
    at com.example.dcsohl.TestTest.testtest(TestTest.java:29)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    ...

我们如何@Mock这种方法?

2 个答案:

答案 0 :(得分:2)

稍微修改您的用例以返回字符串而不是打印到标准输出以下解决方案将起作用。

import static org.junit.Assert.assertEquals;
import org.junit.Test;
import mockit.Expectations;

public class TestTest {

    public interface MyInterface {
        default String foo(int f) {
            return bar(String.valueOf(f));
        }

        String bar(String s);
    }

    public class MyClass implements MyInterface {
        public String bar(String s) {
            return s;
        }
    }

    @Test
    public void testtest() throws Exception {

        MyClass baz = new MyClass();

        new Expectations(MyClass.class) {{
            baz.foo(anyInt); result = "FOOMOCK";
            baz.bar(anyString); result = "BARMOCK";
        }};

        assertEquals(baz.foo(5), "FOOMOCK");
        assertEquals(baz.bar("Hello world"), "BARMOCK");
    }

}

有许多有用的示例,说明如何模拟jmockit github repository的示例部分中概述的方法体(即默认或静态方法)的接口。

答案 1 :(得分:0)

使用@Mocked代替MockUp,它支持默认方法。