Mockito mock无法正常工作

时间:2016-10-18 13:11:05

标签: java testing junit mocking mockito

我有以下测试方法:

@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 。我做错了什么?

1 个答案:

答案 0 :(得分:4)

首先,你不应该实例化插入模拟的对象:

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

相反,请使用:

@InjectMocks
private AccountManager accountManager;

然后,如果你使用Mockito跑步者:

@RunWith(MockitoJUnitRunner.class)

你不应该直接注射嘲笑:

@Before
public void setup() {
    MockitoAnnotations.initMocks(this); //remove this line
}

最后一点:你的嘲笑毫无意义,因为你的注册方法中有一个局部变量:

AuthStorage authStorage = new AuthStorageImpl();
authStorage.registerNewUser(user);

这使得该类使用您的模拟对象。