2014-06-28 4 views
1

Я пытаюсь обновить код из Jmockit 1,1 до 1,9 для доступа в реальном Instance, но это, кажется неудачным, как показано ниже:Как обновить код от 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; 
    } 
} 
+0

Что не удалось? В чем проблема, с которой вы сталкиваетесь? –

+0

Я обновил описание в части исключения в верхней части. Благодарю. – Leo

+0

Что такое код в строке ** ** в классе 'CopyOfAccessRealInstanceTest'? –

ответ

1

Разрешен. Спасибо за Rogério и Sean!

Обратите внимание, что в документации по API говорится, что параметр Invocation должен быть первым параметром в методе mock. - Rogério