记一次单元测试的坑
借鉴了这个大佬的文章junit进行单元测试
先说结论:junit进行单元测试的时候执行结束会调用system.exit()方法,所以这里不适合进行多线程测试。
@Configuration
@SpringBootTest(classes = RedisApplication.class)
public class test {
/**
* 注入客户端
* */
@Autowired
StringRedisTemplate redisTemplate;
@Bean
ValueOperations valueOperations(){
return redisTemplate.opsForValue();
}
class MyThread implements ThreadFactory{
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
thread.setDaemon(false);
return thread;
}
}
/**
* 定义bean
* */
/**
* 模拟多线程情况
* */
@Bean
ExecutorService executors(){
return Executors.newFixedThreadPool(10,new MyThread());
}
/**
* 模拟场景
* */
class Task implements Runnable{
@Override
public void run() {
while(!redisTemplate.opsForValue().setIfAbsent("first","number")){
System.out.println("try to get lock\t"+Thread.currentThread().getName());
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("get lock exec service:"+Thread.currentThread().getName());
valueOperations().getAndExpire("first", Duration.ofSeconds(3));
}
}
@Test
public void zz() throws InterruptedException {
executors().execute(new Task());
executors().execute(new Task());
executors().execute(new Task());
executors().execute(new Task());
executors().execute(new Task());
executors().execute(new Task());
}
}
上述代码模拟了分布式锁的场景,但是测试的时候发现没有任何打印信息。问题如上述结论一样。
这里正确的执行可以在测试方法中使用死循环保证我们的主程序不被退出。从而导致其他线程可以正确执行。