Unit testing 我能';类的mock属性

Unit testing 我能';类的mock属性,unit-testing,mocking,spock,Unit Testing,Mocking,Spock,我刚刚开始使用spock,我面临一个问题 public class UserAuthentication { private UserDAO userDao; public boolean authenticateUser(String email, String password){ User user = userDao.findUserByEmail(email); if(password.equa

我刚刚开始使用spock,我面临一个问题

    public class UserAuthentication {
        private UserDAO userDao;

        public boolean authenticateUser(String email, String password){
            User user = userDao.findUserByEmail(email);

            if(password.equals(user.getDecodedPassword())){
                return true;
            }
            return false;
        }
}


public interface UserDAO {

    User findUserByEmail(String login);

    void saveUser(User user);
}

public class User {

    private String email;
    private String decodedPassword;

    public User(String email, String decodedPassword) {
        this.email = email;
        this.decodedPassword = decodedPassword;
    }(...)
不幸的是,我的测试抛出NullPointerException:

import java.text.SimpleDateFormat
import spock.lang.Specification

class UserAuthenticationTest extends Specification {

    def "Authenticating correct user" () {
        setup:
        def email = "email@email.com"
        def password = "qwerty1234"

        def userDao = Mock(UserDAO)
        userDao.findUserByEmail(email) >> new User(email, password)

        def userAuthenticator = new UserAuthentication()
        userAuthenticator.setUserDao(userDao)

        when:
        def result = userAuthenticator.authenticateUser(email, password)

        then:
        1 * userDao.findUserByEmail(email)
        result == true
    }

}

我得到这个异常是因为mock在被调用时不工作(userDao.findUserByEmail(email);在UserAuthentication类中)


有人知道为什么吗?

当您模拟并验证返回的(来自模拟的)表达式时,应该将其置于
下,然后
块。以下是文档,您可以找到更正的代码:

@Grab('org.spockframework:spock-core:0.7-groovy-2.0')
@Grab('cglib:cglib-nodep:3.1')

import spock.lang.*
import java.text.SimpleDateFormat

class UserAuthenticationTest extends Specification {

    def "Authenticating correct user" () {
        setup:
        def email = "email@email.com"
        def password = "qwerty1234"

        def userDao = Mock(UserDAO) 

        def userAuthenticator = new UserAuthentication()
        userAuthenticator.userDao = userDao

        when:
        def result = userAuthenticator.authenticateUser(email, password)

        then:
        1 * userDao.findUserByEmail(email) >>  new User(email, password)
        result == true
    }
}

public class UserAuthentication {
    UserDAO userDao;

    public boolean authenticateUser(String email, String password){
        User user = userDao.findUserByEmail(email);        
        return password.equals(user.getDecodedPassword());
    }
}

public interface UserDAO {

    User findUserByEmail(String login);

    void saveUser(User user);
}

public class User {

    private String email;
    private String decodedPassword;

    public User(String email, String decodedPassword) {
        this.email = email;
        this.decodedPassword = decodedPassword;
    }

    public String getDecodedPassword() {
        return decodedPassword;
    }
}

感谢它解决了我的问题,但你能解释一下为什么它是这样工作的吗?请看这里:断开的链接:现在看&搜索“结合模拟和存根”