2016-05-26 3 views
2

Я хочу издеваться над объектом класса DataClient в Java. Я не уверен, как насмехаться с переменной-членом s3. Я пришел из рубинового фона, и у нас есть что-то, называемое rspec-mock, где нам не нужно издеваться над переменными экземпляра.Как обмануть частную переменную-член в зависимости от вызова службы

public class DataClient { 

    private String userName, bucket, region, accessKey, secretKey; 
    private AmazonS3Client s3; 

    public OdwClient(String accessKey, String secretKey, String userName, String bucket, String region){ 
    this.accessKey = accessKey; 
    this.accessKey = secretKey; 
    this.userName = userName; 
    this.bucket = bucket; 
    this.region = region; 
    this.s3 = new AmazonS3Client(new BasicAWSCredentials(accessKey, secretKey)); 
    } 

    public boolean pushData(String fileName) { 
    s3.putObject(new PutObjectRequest("bucketName", fileName, new File("filePath")). 
    return true; 
    } 
} 

Все, что я попытался сейчас в тестах:

@Before 
    public void setUp() throws Exception{ 
     DataClient client = Mockito.mock(DataClient.class); 
    } 

    @Test 
    public void testPushData() { 
     // I don't know how to mock s3.putObject() method here 
    } 

Мои тесты держит неудачу.

ответ

1

Вы можете использовать расширение PowerMock, чтобы издеваться над созданием класса AmazonS3Client. Что-то по линии

myMockedS3Client = Mockito.mock(AmazonS3Client.class) 
PowerMockito.whenNew(AmazonS3Client.class).thenReturn(myMockedS3Client) 
+0

Вы имеете в виду ** PowerMockito.whenNew **? –

+0

@IgorGanapolsky вы правы. Обновлен ответ. – ccstep1

2

Проблема, с которой вы сталкиваетесь, заключается в том, что вы не используете инъекцию зависимости. Вся идея насмешки заключается в том, что вы создаете издеваемые объекты для внешних зависимостей. Для этого вам необходимо предоставить эти внешние зависимости вашему объекту. Это можно сделать как аргумент конструктора, или параметр, либо через фреймворк инъекции зависимостей.

Вот как можно переписать свой класс, чтобы быть более проверяемым:

public class DataClient { 

    private String userName, bucket, region, accessKey, secretKey; 
    private AmazonS3Client s3; 

    public OdwClient(String accessKey, String secretKey, String userName, String bucket, String region){ 
    this(accessKey, secretKey, userName, bucket, region, new AmazonS3Client(new BasicAWSCredentials(accessKey, secretKey)); 
    } 

    public OdwClient(String accessKey, String secretKey, String userName, String bucket, String region, AmazonS3Client s3){ 
    this.accessKey = accessKey; 
    this.accessKey = secretKey; 
    this.userName = userName; 
    this.bucket = bucket; 
    this.region = region; 
    this.s3 = s3; 
    } 

    public boolean pushData(String fileName) { 
    s3.putObject(new PutObjectRequest("bucketName", fileName, new File("filePath")). 
    return true; 
    } 
} 

Затем вы можете использовать реальный DataClient экземпляр вместо издеваться и глумиться экземпляр s3 для нового DataClient конструктора. После того, как вы издеваетесь над экземпляром AmazonS3Client, вы можете использовать обычные инструменты для издевательства, чтобы обеспечить ожидаемые ответы от его методов.

Смежные вопросы