繁体   English   中英

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

[英]Java Mockito is hitting real method rather than using mocked method

我的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()时,我希望返回模拟的现有用户对象,但是由于域连接而导致实际方法失败并且测试失败。 我们没有建立域连接来运行Junits。 任何投入都表示赞赏。 谢谢 !

答案是阅读关于Mockito的教程并遵循它。 你犯了一个典型的错误:你创建了一个模拟对象,但是你没有做任何事情,所以你的生产代码使用那个模拟对象。

只是做一个模拟(YourClass)并没有神奇地改变你的生产代码中的new()来返回一个模拟的实例。

您需要在嘲笑实例注入的代码测试。 例如,使用@InjectMock注释。

有关详细介绍,请参阅https://www.baeldung.com/Mockito-annotations

请注意:正如现在所写,您将很难使用Mockito进行测试。 由于直接调用new() ,您需要PowerMock(ito)来测试它。 所以:学习如何使用Mockito,然后重新编写您的生产代码,以便轻松测试。 (转向PowerMock将是错误的策略)。

你的错误在于“依赖注入”原则。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM