单元测试里的怎么用mock函数替换被测试函数里调用的函数?
我有一段代码的逻辑大概是这样的,在utils模块的generate_id里调用了random模块的random_odd_int生成一个ID。
我现在想要想一个测试方法只测试utils模块里generate_id是否正确,random_odd_int函数已经有专门的测试方法了。我该怎么来写这个测试方法在执行单元测试的时候,generate_id调用random_odd_int时调用的是random_odd_int的mock方法每次都返回一个固定值?
我尝试了mockall这个库,但没有成功,mockall设置random_odd_int的mock方法只有在测试方法里调用才起作用,generate_id函数里调用的random_odd_int还是random模块里的方法。
pub mod utils {
use super::random::random_odd_int;
pub fn generate_id() -> String {
// 在这里调用random里的random_odd_int
let seed = random_odd_int();
format!("{:010}", seed)
}
}
#[cfg(test)]
mod tests {
use crate::utils::utils::generate_id;
#[test]
fn test_generate_id() {
let excepted = "newid9091";
// 在调用generate_id之前,我要怎样使用mock才能让random_odd_int返回固定值
let actual = generate_id();
assert_eq!(actual, excepted.to_string());
}
}
可以用 mockall_double
结合 mockall 就是这样: