我有一個非常簡單的類,異步寫入列表保存到文件: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