2013-05-08 2 views
2

Использование JMockit 1.2 баночку, Попытка издеваться метод длины строки, но получение Неожиданное Invocation Exception:JMockit Строка метод конечной длины насмешливый Issue

FAILED: test 
java.lang.IllegalStateException: Missing invocation to mocked type at this point;  please make sure such invocations appear only after the declaration of a suitable mock field or parameter 
at StringDemo.TestA$1.<init>(TestA.java:17) 
at StringDemo.TestA.test(TestA.java:13) 

Я использую TestNG:

@Test 
    public void test() throws Exception 
    { 
    new Expectations() 
     { 
     @Mocked("length") 
     String aString; 
     { 
      aString.length(); 
      result = 2; 
     } 
     }; 

     System.out.println(A.showA("test")); 
    } 
} 

Фактический класс А :

public class A { 
public static int showA(String str){ 
    int a= str.length(); 
    return a; 

} 
} 

ответ

1

Это неправильный способ записи ожидаемого Результаты. Вы не должны издеваться и записывать метод String length(), вместо этого запишите свой showA(). вот решение

@SuppressWarnings("unused") 
    @Test 
    public void test() throws Exception 
    { 

     new Expectations() 
     { 
      @NonStrict 
      final Source mock = null; 

      { 
       Source.showA(anyString); 
       result = 2; 
      } 
     }; 

     assertEquals(2, Source.showA("test")); 
    } 
+0

Yup Я делал это только ранее. Но поскольку мне удалось издеваться над методом getBytes String, я подумал, что он должен работать и на длину. Можете ли вы рассказать мне точную причину, почему она не работает для метода длины? – solvesak

+2

Метод 'String # length()' является одним из немногих, которые не являются макетными JMockit 1.x. Причина того, что этот набор несовместимых методов JRE существует, заключается в том, что они, как известно, вызывают проблемы в JMockit 1.x, если они насмехаются. –

+0

@ Rogério - это приятно знать. Это где-нибудь документировано? –