2012-01-11 103 views
4

我想为我的代码编写JUnit测试,但在我的一些方法中调用了其他方法。有可能嘲笑这些电话吗?您可以在您正在测试的课程中嘲笑方法调用吗?

例如

s3FileWrite(File file, Status status) 
{ 
    S3 s3   = new S3(file.getName, s3Service) 
    String key = s3.getKey(); 
    String bucket = s3.getBucket(); 
    File tmp = new File("tmp/" + s3.getName()); 

    writeFile(key, bucket, tmp, status); //local method call I want to mock out 
}//awsFileWrite 

的WriteFile的方法就是我要嘲笑什么,它是我测试类的一部分,但我不知道如何嘲笑它。我以为嘲笑我正在测试的课程,然后将这个调用添加到我的期望中就可以做到,但仍然会调用该方法。

任何人都可以给我一些建议,请在这里做什么?

编辑:

我JMock的代码如下所示:

@Test 
public void testS3FileWrite() 
{  
    fileName  = context.mock(File.class); 
    s3Service = context.mock(FileDataAccessor.class); 
    s3   = context.mock(S3.class);   
    reportWriter = context.mock(ReportWriter.class); 

    try 
    { 
     context.checking(new Expectations(){{   
      oneOf(fileMetaData).getKey(); 
      will(returnValue("s3Key")); 

      oneOf(fileMetaData).getBucketName(); 
      will(returnValue("BucketName")); 

      oneOf(fileMetaData).getName(); 
      will(returnValue("TempFile")); 

      ((MethodClause) oneOf (any(File.class))).method("File").with(same("tmp/TempFile")); 

      oneOf(reportWriter).writeFile(with(same("s3Key")), 
            with(same("BucketName")), 
            with(any(File.class), 
            with(same(Status.OK))); 
     }});//Expectations 
    } 
    catch (Exception e) 
    { 
     ErrorStatus.debug("Exception in ReportTest.testS3FileWrite: " + e); 
    }//try-catch 

    ReportWriter test = new ReportWriter(status); 
    test.awsFileWrite(fileName, Status.OK); 
}//testAWSFileWrite 
+0

你可以发布任何你模拟类的代码,并定义'writeFile()'的预期结果吗? – jere 2012-01-11 11:55:41

回答

4

PowerMock可以让你部分mock类,但它的设计EasyMock的不JMock的。无论如何,这不是最好的方法。

添加一个新类FileWriter和移动writeFile方法,然后在你的类测试, 委托给一个:

// default implementation, can be replaced in tests 
FileWriter fileWriter = new FileWriter(); 

writeFile(key, bucket, tmp, status) { 
    fileWriter.write(key, bucket, tmp, status); 
}; 

在你的测试代码,覆盖fileWriter领域中的类下用模拟FileWriter测试(添加一个setter或使该字段保护)。

+0

酷:)我已经添加它作为一个内部类阻止代码分离得太多......干杯artbristol – 2012-01-11 14:14:18