Java Mockito поражает реальный метод, а не использует mocked метод - PullRequest
1 голос
/ 29 мая 2019

Мой метод mockito использует реальный метод, а не вызывает метод mockito.Ваши входные данные будут полезны

Java-код.

public class CheckUser {
    private final UserDao userDao;

    public CheckUser (final String domain){
        userDao = new UserDao(domain);
    }

    public IUser getExistingUser(){
            if (userDao == null) {
                throw new RuntimeException("userDao is null");
            }
            IUser existingUser = userDao.getExistingUser();
            if (existingUser == null) {
                throw new RuntimeException("ExistingUser is null");
            }
            return existingUser;
    }
}

Это мой тестовый код JUnit.

    @Test
    public void testExistingUser() {
        UserDao mockUserDao = mock(UserDao.class);
        when(mockUserDao.getExistingUser()).thenReturn(getExistingTestUser());
    }

    private UserDao getExistingTestUser(() {
        return ExistingUserImpl.Builder(). //withfield methods. build();
    }

Я создаю этот фиктивный объект только для целей тестирования.Это просто возвращает ложный объект MockedExistingUserImpl, который реализован IUser.

public class MockedExistingUserImpl implements IUser {
    //fields
    //overriding getter methods for all fields
    //Builder for  ExistingUserImpl
}

Когда я вызываю userDao.getExistingUser () в своем коде, я ожидаю вернуть имитированный объект Existing user, но он попадает в реальный метод и не проходит тест из-за подключения к домену.Мы не устанавливаем доменное соединение для запуска Junits.Любые вклады приветствуются.Спасибо!

Ответы [ 2 ]

2 голосов
/ 29 мая 2019

Ответ - прочитать учебник о Mockito и следовать ему. Вы делаете типичную ошибку: вы создаете фиктивный объект, но затем ничего не делаете, чтобы ваш производственный код использовал этот фиктивный объект.

Простое использование макета (YourClass) не может волшебным образом изменить new () в вашем производственном коде, чтобы вернуть имитированный экземпляр.

Вам необходимо вставить этот макетированный экземпляр в тестируемый код. Например, используя аннотацию @InjectMock.

Хорошее вступление см., Например, https://www.baeldung.com/Mockito-annotations.

И обратите внимание: как написано прямо сейчас, вам будет трудно использовать Mockito для ваших тестов. Из-за прямого вызова new () вам понадобится PowerMock (ito) для его проверки. Итак: узнайте, как использовать Mockito, а затем переделайте свой рабочий код, чтобы его можно было легко тестировать. (обращение к PowerMock было бы неправильной стратегией).

1 голос
/ 29 мая 2019

Ваша ошибка в нарушении принципа внедрения зависимостей.

Не используйте оператор new - создайте UserDao на уровне выше и используйте инъекцию.

public class CheckUser {
    private final UserDao userDao;

    public CheckUser (final UserDao usedDao) {
        this.userDao = userDao;
    }

    public IUser getExistingUser() {
        if (userDao == null) {
            throw new RuntimeException("userDao is null");
        }
        IUser existingUser = userDao.getExistingUser();
        if (existingUser == null) {
            throw new RuntimeException("ExistingUser is null");
        }
        return existingUser;
    }
}

Теперь вы можете проверить свой код следующим образом:

@Test
public void testExistingUser() {
    UserDao mockUserDao = mock(UserDao.class);
    when(mockUserDao.getExistingUser()).thenReturn(getExistingTestUser());

    CheckUser checkUser = new CheckUser(mockUserDao);
    IUser iUser = checkUser.getExistingUser();

    // assertions here
}

private UserDao getExistingTestUser(() {
    return ExistingUserImpl.Builder(). //withfield methods. build();
}
...