Java Mockito正在使用真实方法,而不是使用模拟方法

时间:2019-05-29 18:39:15

标签: java unit-testing mocking mockito junit4

我的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();
    }

我仅出于测试目的而创建此模拟对象。这只是返回由IUser实现的模拟的MockedExistingUserImpl对象。

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

每当我在代码中调用userDao.getExistingUser()时,我都希望返回模拟的Existing用户对象,但是由于域连接,它击中了真实方法并导致测试失败。我们没有建立域连接来运行Junits。任何输入表示赞赏。谢谢!

2 个答案:

答案 0 :(得分:2)

答案是阅读有关Mockito的教程并遵循该教程。您犯了一个典型的错误:创建了一个模拟对象,但是您什么也不做,因此您的生产代码将使用该模拟对象。

仅执行 mock(YourClass)并不会在生产代码中神奇地更改 new()来返回模拟实例。

您需要将模拟的实例注入到要测试的代码中。例如,通过使用@InjectMock批注。

有关简介,请参见https://www.baeldung.com/Mockito-annotations

并注意:按照目前的说法,您将很难使用Mockito进行测试。由于直接调用 new(),因此需要PowerMock(ito)对其进行测试。因此:学习如何使用Mockito,然后重新制作产品代码以使其易于测试。 (转向PowerMock是错误的策略)。

答案 1 :(得分:1)

您的错误是违反了“依赖注入”原则。

不要使用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();
}