2013-10-14 6 views
1

У меня есть метод следующимиздеваться вызова метода с динамическим параметром

private void validate(String schemaName){ 
    .... 
    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);**strong text** 
    Source schemaFile = new SteamSource(getClass().getClassLoader().getResourceAsStream(schemaName)); 
    Schema schema = factory.newSchema(schemaFile); 
    .... 
} 

Этот метод дозвонились из другого метода которым мне нужно проверить (с помощью EasyMock и powermock). Я изо всех сил пытаюсь высмеять следующую строку

Source schemaFile = new SteamSource(getClass().getClassLoader().getResourceAsStream(schemaName)); 

Может кто-нибудь дать мне ключ к этому вопросу?

Текущий статус

Ниже приводится издеваться заявление

expectNew(StreamSource.class, anyObject(InputStream.class)).andReturn(mockedobject); 

Powermock.replay(mockedobject, StreamSrouce.class); 

Это бросает follwing исключение.

org.powermock.reflect.exceptions.TooManyConstructorsFoundException: Several matching constructors found, please specify the argument parameter types so that PowerMock can determine which method you're referring to. 
Matching constructors in class javax.xml.transform.stream.StreamSource were: 
+0

Я также сталкиваюсь с той же проблемой. Пожалуйста, направляйте меня. –

+0

@ K.Senthuran - Я добавил ответ. Надеюсь, это то, что вы ищете. – Avi

+0

Помимо моего первоначального вопроса, было предложено использовать конструкторский макет, который также является возможностью. Вы можете посмотреть мой ответ на другой вопрос о том, как это сделать: http://stackoverflow.com/questions/19307121/replace-implementation-of-instantiated-class-without-to-touch-code-java/ 19308216 # 19308216 – Avi

ответ

2

Я думаю, что вы можете сделать это с помощью powermock следующим образом (я только после урока here):

Допустим, вы класс выглядит следующим образом:

public class MyClass { 
    private void validate(String schemaName) { 
    .... 
    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);**strong text** 
    Source schemaFile = new SteamSource(getClass().getClassLoader().getResourceAsStream(schemaName)); 
    Schema schema = factory.newSchema(schemaFile); 
.... 
    } 
} 

Вы должны создать тестовый класс, как это:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(MyClass.class) 
public class MyClassTest { 

    private MyClass testedClass = new MyClass(); 
    private ClassLoader mockedClassLoader = createMock(ClassLoader.class); 
    private InputStream mockedInputStream = createMock(InputStream.class); 

    @Before 
    public void setUp() { 
     PowerMock.createPartialMock(MyClass.class, "getClass"); 
     expect(testedClass.getClass()).andReturn(mockedClassLoader); 
     expected(mockedClassLoader.getResourceAsStream(***You string***)).andReturn(mockedInputStream); 
     replayAll(); // Not sure if that's the name of the method - you need to call replay on all mocks 
    } 


    @Test 
    public void testValidate() { 
     // Run your test logic here 
    } 
} 

Мольба извините меня, если некоторые из методов easymock, которые я использовал, называются несколько иначе. Но это основная идея.

+0

Это кажется излишним. Просто издевайтесь над вызовом конструктора. –

+0

Я пробовал этот Ави с некоторыми изменениями. Я должен использовать ожидающий вызов, например «EasyMock.expect (....)», затем вторая строка метода setUp, которую я должен был изменить, похожа на «EasyMock.expect (провереноClass.getClass(). GetClassLoader()). ИReturn (mockedClassLoader);». 3-я строка, я думаю, вы снова ожидаете. Но я получаю исключение «java.lang.IllegalStateException: no last call on mock available» из строки 2 метода установки. –

+0

@susithasenarath Вы помещаете аннотацию 'PrepareForTest' поверх класса с классным классом? Важно – Avi

1

Я думаю, вам нужно одно или несколько следующих. Используйте Powermock конструктор, издевательский над new StreamSource, как задокументировано here: Powermock MockConstructor. Вам, вероятно, также понадобится использовать макет для SchemaFactory, что означает, что вам нужно будет издеваться над статическим вызовом метода фабрики через Powermock: MockStatic

+0

Я начинаю вот так: Источник mockSource = createMock (Source.class) expectNew (Source.class, InputStream.clas); с "getClass(). GetClassLoader(). GetResourceAsStream (schemaName)" возвращает InputStream Я поместил параметр в качестве класса InputStream. Это верно? –

+0

Выглядит правильно .... –

+0

Не работает. просто replayAll() должен инициировать макет, не так ли. У меня есть как easymock, так и заявления Powermock. –

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