2012-01-11 105 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