你通过分离和/或injection来测试它:
// ** WARNING: Untested code
原创
void funcToTest(String a, String b) {
int i = new Random().nextInt(2);
return ((i == 0) ? a : b);
}
分离
void funcToTest(String a, String b) {
return funcToTest(a, b, (new Random().nextInt(2) == 0));
}
void funcToTest(String a, String b, boolean r) {
return (r ? a : b);
}
现在测试
funcToTest(String a, String b, boolean r).
您相信这一点,如果您测试上述内容,那么
funcToTest(String a, String b)
会正常工作。
注入
interface BoolRandomizer {
bool getBool();
}
BoolRandomizer BOOL_RANDOMIZER = new BoolRandomizer() {
public bool getBool() { return (new Random().nextInt(2) == 0); }
}
BoolRandomizer ALWAYS_FALSE_RANDOMIZER = new BoolRandomizer() {
public bool getBool() { return false; }
}
BoolRandomizer ALWAYS_TRUE_RANDOMIZER = new BoolRandomizer() {
public bool getBool() { return true; }
}
class ClassUnderTest {
private final BoolRandomizer br;
ClassUnderTest() { this(BOOL_RANDOMIZER); }
ClassUnderTest(BoolRandomizer br) { this.br = br; }
void funcToTest(String a, String b) {
return (br.getBool() ? a : b);
}
}
现在测试
new ClassUnderTest(ALWAYS_FALSE_RANDOMIZER).funcToTest()
和
new ClassUnderTest(ALWAYS_TRUE_RANDOMIZER).funcToTest()
当然有更复杂/更巧妙的方法可以做到这一点,但这是基本思想。我将这些技术用于一副纸牌程序来测试洗牌功能。另一种情况:通过调用系统 API gettime() 使用当前时间的函数可能很难测试,除非您愿意在一天中非常特定的时间运行单元测试:-)。分离和注入易于测试。