2016-12-02 1 views
-1

Используемая версия JMockit: 1.21 У меня такой интерфейс. TestInterface:Jmockit: проверить метод вызова поля интерфейса

public interface TestInterface { 
    boolean callMethod(); 
} 

TestClass есть поле представляет собой экземпляр этого интерфейса TestClass:

public class TestClass { 
    private final TestInterface inner = new TestInterface() { 
     @Override 
     public boolean callMethod() { 
      subMethod(); 
      return false; 
     } 
    }; 
     public void subMethod() { System.out.println("Sub method"); 
    }; 
} 

Я пытаюсь проверить метод на поддельных interfacein этого учебника вызова. http://jmockit.org/tutorial/Faking.html#interfacesd

Метод испытания.

public class TestInterfaceTest { 
    TestClass sut; 
    @Before 
    public void setUp() { 
     sut = Deencapsulation.newInstance(TestClass.class); 
    } 
    @Test 
    public void mockAllClassesImplementingAnInterface() { 

     TestInterface testInterface = new MockUp<TestInterface>() { 
      @Mock 
      public boolean callMethod(Invocation inv) { 
       inv.proceed(); // throw exception here -> Will my expected method be called here? 
       return true; 
      } 
     }.getMockInstance(); 

     Deencapsulation.setField(sut, "INTER", testInterface); 

     new NonStrictExpectations() { 
      { 
       Deencapsulation.invoke(sut, "subMethod"); 
      } 
     }; 

     Boolean result = Deencapsulation.invoke(Deencapsulation.getField(sut, "INTER"), "callMethod"); 

     assertTrue(result); 

     new Verifications() { 
      { 
       Deencapsulation.invoke(sut, "subMethod"); times = 1; 
      } 
     }; 
    } 
} 

java.lang.IllegalArgumentException: Нет Класс с именем "ndroid.examples.helloandroid $ Impl_TestInterface" найдено

Если вы, ребята, не возражаете, не могли бы вы сказать мне, как решить этот byg. Большое спасибо.

+0

После того, как я установил ошибки в вашей «образец кода» (* пожалуйста * убедитесь, что ваш [MCVE] (http://stackoverflow.com/help/mcve) компилируется и работает!), Все работало нормально и Я не видел эту ошибку. Вам придется подробно остановиться на вашей проблеме. – dcsohl

+0

Спасибо @dcsohl за подтверждение. Текущий, я реализую в версии 1.21, он будет бросать эту ошибку. Не только версия 1.21, но и версия 1.29 также выдает это исключение. : D Какую версию вы использовали для воспроизведения моей ошибки? –

+0

Я тестирую на Android Studio: D –

ответ

2

Ваша проблема, в моей переоценке этой проблемы, кажется, лежит в строке inv.proceed(). Вы не можете иметь эту строку в интерфейсе Mockup.

Invocation.proceed() предназначен, если вы хотите выполнить MockUp, чтобы перейти к реальному коду. Но поскольку вы издеваетесь над интерфейсом, нет реального кода. Вы можете подумать, что это связано с тем, что ваша реализация TestClass имеет анонимную реализацию интерфейса, но MockUp ничего не знает об этом анонимном классе; он выполняет макет интерфейса, а не анонимную реализацию.

Если вы избавитесь от этой линии, звоните по телефону Invocation.proceed(), я думаю, вы обнаружите, что ваша ошибка исчезла.

+0

Спасибо за вашу помощь. Значит, мы не собираемся проверять анонимный метод? –

+0

Я этого не говорил. Я сказал, что вы не можете в нее вступить. Вы можете издеваться над этим и проверить, что он называется. – dcsohl

+0

Я имею в виду, что мы не могли обработать этот класс и убедиться, что subMehod был вызван внутри фактического метода. Это правильно? Большое спасибо за любезную поддержку. –

-1

Основано на руководстве @dcsohl. Код ниже работает для меня.

@Test 
    public void mockAllClassesImplementingAnInterface() { 
     // Partial mocking 
     new NonStrictExpectations(sut) { 
      { 
       sut.subMethod(); 
      } 
     }; 

     // Actual invocation 
     Deencapsulation.invoke(Deencapsulation.getField(sut, "inner"), "callMethod"); 
     // Verify 
     new Verifications() { 
      { 
       Deencapsulation.invoke(sut, "subMethod"); 
       times = 1; 
      } 
     }; 
    } 
+0

Я боюсь, что этот тест полон ошибок (не следует использовать 'Deencapsulation.invoke', для одного). Но что более важно, все (тест + код, который нужно протестировать) кажется бессмысленным ... Правильный тест должен проверять какое-то осмысленное и внешне наблюдаемое поведение. –

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