2015-09-24 8 views
0

Я хотел бы явно не указывать метод, который я вызываю в аргументах invokeMethod(). Powermock предлагает перегруженный invokeMethod(), который передает метод, основанный на переданных параметрах.Как использовать метод Whitebox.invokeMethod (объект Object, Object ... arguments) Powermock, когда мой первый параметр метода - тип String?

invokeMethod(Object instance, Object... arguments) 

Проблема Я бегу в том, что мой первый параметр имеет тип String. Это вызывает метод invokeMethod() с подписью,

invokeMethod(Object instance, String methodToExecute, Object... arguments) 

Вот модель теста ...

@Test 
public void thisIsATest() throws Exception{ 
    TheClassBeingTested myClassInstance = new TheClassBeingTested(); 
    String expected = "60"; 
    String firstArgument = "123A48"; 

    ReturnType returnedTypeValue = Whitebox.invokeMethod(myClassInstance, firstArgument, AnEnum.TypeA); 
    String actual = returnedTypeValue.getTestedField(); 
    assertEquals("Expected should be actual when AnEnum is TypeA", expected, actual); 
} 

Это дает мне ошибку,

org.powermock.reflect.exceptions.MethodNotFoundException: No method found with name '123A48' with parameter types: [ AnEnum ] in class TheClassBeingTested.` 

Я получил его на работу изменив тип первого параметра на Object, но мне это кажется грязным.

@Test 
public void thisIsATest() throws Exception{ 
    TheClassBeingTested myClassInstance = new TheClassBeingTested(); 
    String expected = "60"; 
    Object firstArgument = "123A48"; 

    ReturnType returnedTypeValue = Whitebox.invokeMethod(myClassInstance, firstArgument, AnEnum.TypeA); 
    String actual = returnedTypeValue.getTestedField(); 
    assertEquals("Expected should be actual when AnEnum is TypeA", expected, actual); 
} 

Есть правильный способ передать String типа в качестве первого аргумента, а не жесткого кодирования моего имени метода в invokeMethod() вызова? Я ничего не нашел в документации Powermock или форумах, рассматривающих это, но это, конечно, не может быть так уж необычно.

ответ

0

Что вам действительно нужно сделать, это посмотреть на TheClassBeingTested.java. В сообщении об ошибке сообщается, что проблема заключается в том, что метод Whitebox.invoke не может найти метод с именем «123A48» в TheClassBeingTested, который создается путем отражения. В этом случае метод invokeMethod, который, я думаю, вы выбрали, ищет параметры (Object classUnderTest, String methodName, Object ... parameters).

попробовать что-то вроде этого:

public class TheClassBeingTested { 
    private String foo; 

    public void setFoo(String fooValue) { 
     foo = fooValue; 
    } 

    public String getFoo() { 
     return foo; 
    } 

} 

Затем вы можете проверить с Whitebox так:

public class TheClassBeingTestedTester { 

    @Test 
    public void thisIsATest() throws Exception { 
     TheClassBeingTested toBeTested = new TheClassBeingTested(); 
     String theMethodToTest = "setFoo"; 
     String expectedFooValue = "foo bar baz"; 

     ReturnType returnedTypeValue = Whitebox.invokeMethod(toBeTested, theMethodToTest, expectedFooValue); 
     String actual = returnedTypeValue.getTestedField(); 
     assertEquals("Expected " + expected + " but found " + actual, expected, actual); 
    } 
} 

Надежда, что помогает.

... отредактированный ответ ниже

Как мне не удалось прочитать Ваш вопрос внимательно, а также работать на других разработках, я пропустил точку.

В этом случае, я хотел бы сделать следующее изменение в тест, чтобы избежать проблемы метода Invoke неоднозначности:

@Test 
public void thisIsATest() throws Exception{ 
    TheClassBeingTested myClassInstance = new TheClassBeingTested(); 
    String expected = "60"; 

    Object[] parameters = new Object[]{"123A48", AnEnum.TypeA}; 

    ReturnType returnedTypeValue = Whitebox.invokeMethod(myClassInstance, parameters); 

    String actual = returnedTypeValue.getTestedField(); 
    assertEquals("Expected should be actual when AnEnum is TypeA", expected, actual); 

}

Таким образом, неоднозначность удаляется, так что InvokeMethod (Object instance, Object ... arguments) будет видеть только массив объектов, который является сигнатурой метода, который компилятор должен ожидать. Даже несмотря на то, что String является объектом, в отражении подписи метода, java.lang.reflect переустанавливает вторую подпись, которую, по вашему мнению, пытается сказать ей использовать по той, которую вы хотите использовать.

Надеюсь, что этот ответ удовлетворит ваш запрос лучше.

+0

Я понимаю, что я могу вызвать метод путем жесткого кодирования буквального имени.Powermock рекомендует использовать invokeMethod (Object instance, Object ... arguments), если подпись параметра метода уникальна (что она есть), и я склонен согласиться. – pluralMonad