Mockito mock无法正常工作



我有以下测试方法:

@RunWith(MockitoJUnitRunner.class)
public class AccountManagerTest {
    @InjectMocks
    private AccountManager accountManager = new AccountManagerImpl(null);
    @Mock
    private AuthStorage authStorage;
    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }
    /* REGISTER TESTS */
    @Test
    public void test_whenRegister_withAlreadyExistingEmail_thenDoNotRegister() throws AuthStorageException {
        String email = "foo@bar.com";
        String name = "Foo";
        String password = "123456";
        String password2 = "123456";
        doThrow(new AuthStorageException("Email already in use")).when(authStorage).registerNewUser(Matchers.any());
        assertFalse(accountManager.register(email, name, password, password2));
    }
}

测试以下类方法:

@Override
    public Boolean register(String email, String name, String password, String password2) {
        if (password.equals(password2)) {
            try {
                String pwd = hashPassword(password);
                User user = new User(email, name, pwd);
                AuthStorage authStorage = new AuthStorageImpl();
                authStorage.registerNewUser(user);
                return true;
            } catch (NoSuchAlgorithmException | AuthStorageException e) {
                return false;
            }
        }
        // If passwords don't match
        return false;
    }

据说,当调用registerNewUser时,它应该是一个异常,然后该方法将返回false,但在调试时,我看到异常没有被抛出,程序返回true。我做错了什么?

首先你不应该实例化插入mock的对象:

@InjectMocks
private AccountManager accountManager = new AccountManagerImpl(null);

可以这样写:

@InjectMocks
private AccountManager accountManager;

如果你使用Mockito runner:

@RunWith(MockitoJUnitRunner.class)

你不应该直接注入mock:

@Before
public void setup() {
    MockitoAnnotations.initMocks(this); //remove this line
}
最后一点:mock没有意义,因为在register方法中有一个局部变量:
AuthStorage authStorage = new AuthStorageImpl();
authStorage.registerNewUser(user);

相关内容

  • 没有找到相关文章

最新更新