以下是我的报错截图
可以看到,出现了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";
}
}