Метод модульного теста не использует макет объекта при запуске теста. Вместо этого вызывает фактический класс и метод - PullRequest
0 голосов
/ 01 февраля 2020

У меня есть класс для тестирования с именем ClassToTest. Он вызывает CloudService для загрузки файла.

public class ClassToTest {
    public String moveFilesToCloud(String path, String documentclass, String objStore) {
        log.info("Moving files to cloud.");
        String docId = StringUtils.EMPTY;
        CloudService service = new CloudService();
        try {
            docId = service.uploadDocument(path,documentclass,objStore,"");
        } catch (CloudException e) {
            log.info("* Error uploading reports to cloud *" + e.getMessage());
        }
        return docId;
    }
}

Ниже приведен тестовый класс. В тестовом классе есть поддельный объект для CloudService. Когда я запускаю тест вместо получения смоделированного объекта, выполняется фактический CloudService и происходит сбой.

@Mock
CloudService cloudService;

@InjectMocks
ClassToTest classToTest;

@Test
public void testMoveFilesToCloud() throws Exception {
    String pass = "pass";
    when(cloudService.uploadDocument("abc","def","ghi","")).thenReturn(pass);

    String result = classToTest.moveFilesToCloud("abc","def","ghi");

    assertEquals(result,pass);
}

Я ожидаю, что при выполнении этой строки будет использоваться смоделированный объект для CloudService -

CloudService service = new CloudService ();

Вместо этого он фактически пытается создать новый экземпляр CloudService.

Где я нахожусь что не так?

Ответы [ 2 ]

2 голосов
/ 01 февраля 2020

Попробуйте использовать внедрение зависимостей. Сделайте CloudService полем ClassToTest. Измените конструктор ClassToTest, чтобы принять CloudService. Затем Mockito может ввести макет в ClassToTest в вашем модульном тесте.

public class ClassToTest {

    private CloudService service;

    public ClassToTest(CloudService service) {
        this.service = service;
    }

    public String moveFilesToCloud(String path, String documentclass, String objStore) {
        log.info("Moving files to cloud.");
        String docId = StringUtils.EMPTY;
        try {
            docId = service.uploadDocument(path,documentclass,objStore,"");
        } catch (CloudException e) {
            log.info("* Error uploading reports to cloud *" + e.getMessage());
        }
        return docId;
    }
}
1 голос
/ 01 февраля 2020

Это не будет работать.

Если вы использовали инъекцию, то добавление @RunWith(MockitoJUnitRunner.class) было бы полезно, но это не так.

Если вы можете использовать инъекцию, сделайте это, в противном случае вы должны использовать PowerMockito чтобы изменить байт-код и создать макет при вызове конструктора. Это может помочь вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...