java - Mockito 模拟无法正常工作

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

最佳答案

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

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

相反,使用这个:

@InjectMocks
private AccountManager accountManager;

然后如果你使用 Mockito runner:

@RunWith(MockitoJUnitRunner.class)

你不应该直接注入(inject)模拟:

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

最后一点:您的模拟没有意义,因为您的 register 方法中有一个局部变量:

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

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

关于java - Mockito 模拟无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40109261/

相关文章:

java - 如何转换 12/31/2008 3 :28p using Java's SimpleDateFormat

iPhone OpenGL fps 测试

javascript - 如何正确测试 javascript 小部件?

java - Spring JUnit 测试用例失败

java - 我可以使用 Tomcat 上下文参数配置 Log4j 吗?

java - 使用 Jetty Websocket 客户端进行摘要式身份验证

java - ByteBuddy - 获取在拦截()内声明类的注释

angular - 如何以 Angular Testing 以下异步函数?

java - 运行项目构建作为单元测试的一部分?

java - @BeforeClass注解: Junit vs TestNG