我有一个非常简单的类,异步写入列表保存到文件:TestNg多线程问题。 TestNG的不尊重子线程
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
public enum FileOps {
INSTANCE;
private ExecutorService threadPool = Executors.newFixedThreadPool(30);
private AtomicInteger fileCount = new AtomicInteger(0);
private <T> void writeListToFile(String fileName, List<T> obj) {
FileWriter writer = null;
Type tType = new TypeToken<ArrayList<T>>() {
private static final long serialVersionUID = 4376511240656742709L;
}.getType();
Gson gson = new Gson();
try {
writer = new FileWriter(fileName);
writer.append(gson.toJson(obj, tType));
writer.flush();
} catch (Exception e) {
} finally {
try {
writer.close();
} catch (IOException e) {
}
}
}
public <T> void asynWriteListToFile(List<T> obj){
threadPool.execute(new Runnable() {
@Override
public void run() {
String fileName = "C:\\data\\" + fileCount.incrementAndGet() + "_data.txt";
System.out.println(fileName);
FileOps.INSTANCE.writeListToFile(fileName, obj);
}
});
}
}
我已经写了单元测试
import java.util.ArrayList;
import java.util.List;
import org.testng.annotations.Test;
public class FileOpsTest {
@Test
public void asynWriteListToFile() {
List<Integer> list = new ArrayList<>();
list.add(3);
for (int i = 0; i < 10000; i++) {
FileOps.INSTANCE.asynWriteListToFile(list);
}
}
}
我这个类用TestNG
有一个奇怪的情况。在我的TestNg执行中,一些测试引擎如何不等待子线程完成。所以我期望在磁盘上写入10000个文件,但每次看到写入磁盘的文件较少。但是,如果我使用主要方法编写客户端,一切正常。import java.util.ArrayList;
import java.util.List;
public class FileOpsClient {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(3);
for (int i = 0; i < 10000; i++) {
FileOps.INSTANCE.asynWriteListToFile(list);
}
}
}
不知何故testNg引擎关闭我的线程池。
批评人士不直接使用FileWriter,而是将抽象Writer类型注入到模拟方法中,而对于更多可测试的代码更改方式则改变了单元测试的方式。这是一个顿悟。谢谢。 – cgon