Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Suggestions for a java Mock File (to mock java.io.File)

Does anyone have suggestions for a java mock File object? I Am using a thirdparty class which need to get a java.io.File object as argument. I receive the data for this file in a stream over a webservice (also one of their products).

One solution is to write all this data to a file and offer this to the class. This is a solution I don't like: it takes away the advantage of using the webservice in stead of just downloading the file.

Quicker and more efficient would be to put this data from memory in a Mock File and offer this Mock File to the thirdparty class.

It would probably have to be a MockFile extending the java.io.File and overriding all the functions that do actual interfacing with the file on the hard disk.

I know the thirdparty should have used a stream as an input argument in stead of a file. However, this is beyond my influence.

like image 593
michel.iamit Avatar asked Jun 30 '10 09:06

michel.iamit


2 Answers

Does the tested class only query the mock File's name, attributes etc., or does it actually attempt to open the file?

In the former case, you can easily create your mock using e.g. EasyMock or an equivalent mocking framework.

The latter case is more tricky, and I am afraid if the input stream is created internally by the class, you have no choice other than actually creating a real test file on the HD.

like image 36
Péter Török Avatar answered Sep 30 '22 21:09

Péter Török


This is just a suggestion based on my understanding of your question. I believe, you must be doing something like this,

public void doSomething(){
      //Pre processing
       Object result=new ThirdPartyCode().actualMethod(file);
     //Post processing
}

Mock objects make more sense from an unit testing perspective. Your objective is not to unit test the third party library function.Whereas it is to unit test doSomething() method. So probably you can create a wrapper around the third party function.Maybe something like this,

public class Wrapper implements MyWrapper{

   public Object invokeThirdPartyFunction(File file){
      new ThirdPartyCode().actualMethod(file);
   }
}

Now you can create a mock wrapper(implementing the same interface) and use this mock wrapper for all your junit cases.

like image 132
chedine Avatar answered Sep 30 '22 21:09

chedine