2016-07-13 1 views
1

Попытка применить метод MockUp по методу интерфейса по умолчанию Java 8, а JMockit сообщает мне, что метод не найден. Это было проверено с помощью JMockit 1.15, 1.19 и 1.25. Вот очень простой случай использования:Как использовать JMockit MockUp для метода интерфейса по умолчанию

@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 этот метод?

ответ

0

Используйте @Mocked вместо MockUp, он поддерживает методы по умолчанию.

+0

Так что 'MockUp' просто не поддерживает это вообще? Обычно я не использую 'MockUp', если только это не нужно, и это казалось бы ситуацией, чтобы оправдать ее - очевидно, более сложным, чем вышеупомянутый метод ... но это не может быть сделано? – dcsohl

+1

Да, в настоящее время (до JMockit 1.25), 'MockUp' не поддерживает методы, реализованные в интерфейсах (по умолчанию или статические методы). В будущем можно будет добавить поддержку. –

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.

Смежные вопросы