Phoenix
Phoenix

Reputation: 8923

How do I force a method in Groovy to throw an exception

I wanted to write a test for a method in Groovy that throws an IOException. The only way for me to simulate this in the test is to force the method to throw this exception This is what the original code looks like:

    public void cleanUpBermudaFiles(RequestMessage requestMessage)

    {
    final File sourceDirectory = new  File(preferenceService.getPreference("bermuda.landingstrip") + File.separator + requestMessage.getWorkflowId().getValue());

    if(sourceDirectory!=null && sourceDirectory.exists())
    {
         deleteDirectory(sourceDirectory);
    }
    else
    {
        LOG.error("Directory must exist in order to delete");
    }

}

private void deleteDirectory(File directoryToDelete)
{
    try {
        FileUtils.deleteDirectory(directoryToDelete);
    } catch (Exception e) {
        LOG.error("Failed to delete Bermuda files directory located at:" + directoryToDelete.getPath() + "with an exception" + e.getMessage());
    }
}

MY TEST: (I'm looking for a way to make deleteDirectory throw IOException)

     public void testCleanUpBermudaFailure()
    {
    workflowId = new WorkflowId("123456")
    workflowDirectory = new File(srcDirectory, workflowId.value)
    workflowDirectory.mkdir()
    File.createTempFile('foo','.lst', workflowDirectory)
    def exception = {throw new IOException()}

    expect(mockRequestMessage.getWorkflowId()).andReturn(workflowId)
    expect(mockPreferenceService.getPreference("bermuda.landingstrip")).andReturn(srcDirectory.path)
    replay(mockPreferenceService, mockRequestMessage)
    fileCleanUpService.preferenceService = mockPreferenceService
    fileCleanUpService.metaClass.deleteDirectory = exception
    fileCleanUpService.cleanUpBermudaFiles(mockRequestMessage)
    verify(mockPreferenceService, mockRequestMessage)
    assert srcDirectory.listFiles().length == 0, 'CleanUp failed'

}

Upvotes: 3

Views: 22502

Answers (2)

doelleri
doelleri

Reputation: 19682

If the service class is a Groovy class, you would want to mock FileUtils like:

FileUtils.metaClass.static.deleteDirectory = { File f -> throw new IOException() }

However, as ataylor pointed out, you cannot intercept calls if it's a Java class. You can find a nice blog post about it here.

Upvotes: 2

ataylor
ataylor

Reputation: 66069

You are mocking a no-arg call to deleteDirectory, but the real deleteDirectory takes one argument of type File. Try this:

def exception = { File directoryToDelete -> throw new IOException() }
...
fileCleanUpService.metaClass.deleteDirectory = exception

Upvotes: 0

Related Questions