软件测试,在EasyMock中遇到expected: 1, actual: 0的解决办法,当你传入的是对象参数时所需要规避的坑

以下是我的报错截图

可以看到,出现了expected: 1, actual: 0。这句话的意思是,UserDao.addUser(User)这个函数没有被调用到。

但是从最上面报错的两行可以看到,我调用的函数中对象参数和我expect的函数中对象的参数是一样的。

一样的对象参数,却不能被识别?于是,大坑出现了。

一言以蔽之:在java中,new对象时,无论它里面变量是否一样,它的new地址不一样,java就认为它不一样。

这也是为什么String比较要用equal来,而不是直接用=号。

解决办法:

将 EasyMock.expect(userDao.addUser(user)).andReturn(usernameVerify); 的对象参数user改成anyObject()

修改前:

        User user = new User();
        user.setUsername("admin");
        user.setPassword("123");
        // 创建对象
        UserDao userDao = EasyMock.createStrictMock(UserDao.class);
        // 记录
        EasyMock.expect(userDao.addUser(user)).andReturn(usernameVerify);
        EasyMock.expectLastCall();
        // 使能设置
        EasyMock.replay(userDao);

修改后:

        User user = new User();
        user.setUsername("admin");
        user.setPassword("123");
        // 创建对象
        UserDao userDao = EasyMock.createStrictMock(UserDao.class);
        // 记录
        EasyMock.expect(userDao.addUser(anyObject())).andReturn(usernameVerify);
        EasyMock.expectLastCall();
        // 使能设置
        EasyMock.replay(userDao);

成功通过!

以下为我单元测试的源代码

import com.example.ssh_test.dao.UserDao;
import com.example.ssh_test.entity.User;
import com.example.ssh_test.service.UserService;
import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Assume;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Collection;

import static org.easymock.EasyMock.*;

/**
 * 步骤一: 指定定参数运行器
 */

@RunWith(Parameterized.class)
public class UserServiceTest {
    /**
     * 步骤二:声明变量
     */
    enum Type {
       Login , Register
    }

    Type type;
    private boolean usernameVerify;
    private boolean passwordVerify;
    private boolean expect;

    private String username;
    private String password;
//    测试器
    private UserService userService;


    /**
     * 步骤三:为测试类声明一个带有参数的公共构造函数,为变量赋值
     */
    public UserServiceTest(Type type, boolean usernameVerify,boolean passwordVerify,boolean expect) {
        this.type = type;
        this.usernameVerify = usernameVerify;
        this.passwordVerify = passwordVerify;
        this.expect = expect;
    }

    /**
     * 步骤四:为测试类声明一个使用注解 org.junit.runners.Parameterized.Parameters 修饰的,返回值为
     * java.util.Collection 的公共静态方法,并在此方法中初始化所有需要测试的参数对
     *   1)该方法必须由Parameters注解修饰
     2)该方法必须为public static的
     3)该方法必须返回Collection类型
     4)该方法的名字不做要求
     5)该方法没有参数
     */
    @Parameterized.Parameters
    public static Collection primeNumbers() {
        return Arrays.asList(new Object[][]{
                {Type.Login,true ,true,true},
                {Type.Login, true,false ,false},
                {Type.Login, false,true ,false},
                {Type.Login, false,false ,false},
                {Type.Register, true, true,true},
                {Type.Register, false,true, false }
        });
    }

    /**
     * 步骤五:编写测试方法,使用自定义变量进行测试
     * service 主要测试Dao调用顺序
     */
    @Test
    public void testLoginVerify() {
        //判断是否是这个测试函数
        Assume.assumeTrue(type == Type.Login);
        // 创建对象
        UserDao userDao = EasyMock.createStrictMock(UserDao.class);
        // 记录
        EasyMock.expect(userDao.verifyUsername(anyString())).andReturn(usernameVerify);
        EasyMock.expectLastCall();
        EasyMock.expect(userDao.verifyPassword(anyString(),anyString())).andReturn(passwordVerify).anyTimes();
        EasyMock.expectLastCall();
        // 使能设置
        EasyMock.replay(userDao);
        // 接下来调用Service进行测试
        userService.setUserDao(userDao);
        boolean actual = userService.loginVerify(username,password);
        Assert.assertEquals(expect,actual);
        // 进行校验
        EasyMock.verify(userDao);
    }

    /**
     * 步骤五:编写测试方法,使用自定义变量进行测试
     */
    @Test
    public void testUserRegister() {
        //判断是否是这个测试函数
        Assume.assumeTrue(type == Type.Register);
        User user = new User();
        user.setUsername("admin");
        user.setPassword("123");
        // 创建对象
        UserDao userDao = EasyMock.createStrictMock(UserDao.class);
        // 记录
        EasyMock.expect(userDao.addUser(anyObject())).andReturn(usernameVerify);
        EasyMock.expectLastCall();
        // 使能设置
        EasyMock.replay(userDao);
        // 接下来调用Service进行测试
        userService.setUserDao(userDao);
        boolean actual = userService.userRegister(username,password);
        Assert.assertEquals(expect,actual);
//        // 进行校验
        EasyMock.verify(userDao);
    }

    @Before
    public void init(){

        userService = new UserService();
        username = "admin";
        password = "123";
    }

}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值