Можете ли вы смоделировать вызовы методов в классе, который вы тестируете? - PullRequest
4 голосов
/ 11 января 2012

Я пытаюсь написать тесты JUnit для своего кода, но в некоторых моих методах вызываются другие методы. Можно ли издеваться над этими вызовами?

* 1003 Е.Г. *

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 - это то, что я хочу смоделировать, и это часть класса, который я тестирую, но я не знаю, как его смоделировать. Я подумала, что вычеркнуть класс, который я тестирую, а затем добавить вызов к моим ожиданиям, но это все равно вызовет метод.

Может кто-нибудь дать мне совет, что делать здесь, пожалуйста?

EDIT:

Мой код 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

1 Ответ

4 голосов
/ 11 января 2012

PowerMock позволяет частично имитировать классы, но он предназначен для 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.

...