Susitha Ravinda Senarath
Susitha Ravinda Senarath

Reputation: 1678

mock a method call with dynamic parameter

I have a method as follows

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);
    ....
}

This method get called from another method which I need to test(Using easymock and powermock). I'm struggling to mock following line

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

Can someone give me a clue on this?

Current Status

Following is the mock statement

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

Powermock.replay(mockedobject, StreamSrouce.class); 

This throws the following exception.

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:

Upvotes: 1

Views: 2818

Answers (2)

John B
John B

Reputation: 32979

I think you need one or a combination of the following. Use Powermock constructor mocking for the new StreamSource as documented here: Powermock MockConstructor. You will probably also need to use a mock for SchemaFactory which mean you will need to mock the static factory method call via Powermock: MockStatic

Upvotes: 1

Avi
Avi

Reputation: 21866

I think you can do it using powermock in the following way (I'm just following the tutorial here):

Let's say you're class looks like this:

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);
....
   }
}

You should create a test class like this:

@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
   }
}

Please excuse me if some of the easymock methods I used are named a bit differently. But this is the basic idea.

Upvotes: 2

Related Questions