Mock Runtime.getRuntime()?

Rich picture Rich · Feb 13, 2010 · Viewed 8.7k times · Source

Can anyone make any suggestions about how best to use EasyMock to expect a call to Runtime.getRuntime().exec(xxx)?

I could move the call into a method in another class that implements an interface, but would rather not in an ideal world.

interface RuntimeWrapper {
    ProcessWrapper execute(String command) throws IOException;
}

interface ProcessWrapper {
    int waitFor() throws InterruptedException;
}

I was wondering if anyone had any other suggestions?

Answer

Bozho picture Bozho · Feb 13, 2010

Your class shouldn't call Runtime.getRuntime(). it should expect a Runtime to be set as its dependency, and work with it. Then in your test you can easily provide a mock and set it as a dependency.

As a sidenote, I'd suggest watching this lecture on OO Design for testability.

Update: I didn't see the private constructor. You can try using java bytecode instrumentation in order to add another constructor or make the constructor public, but that might turn out to be impossible as well (if there are some restrictions on that class).

So your option is to make a wrapper (as you suggested in the question), and follow the dependency-injection approach.