我的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。任何输入表示赞赏。谢谢!
答案 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();
}