我有下一个服务类:
#include <iostream>
#include <cmath>
#include <fstream>
#include <vector>
#include <numeric>
#include <iterator>
#include <map>
#include <string>
//C++ clang
using namespace std;
void Free(double** a, unsigned int n)
{
if (a!=NULL)
{
for (unsigned int j=0 ; j<n ; j++)
{
delete[] a[j];
}
delete[] a;
}
}
double mDeterminant(double** a, unsigned int n)
{
if (n==1)
{
return a[0][0];
}
else if(n==2)
{
return a[0][0]*a[1][1]-a[0][1]*a[1][0];
}
else
{
double res=0.0;
for (unsigned int i=0 ; i<n ; i++)
{
double** A=new double*[n-1];
for (unsigned int j=0 ; j<n-1 ; j++)
{
A[j]=new double[n-1];
}
for (unsigned int j=1 ; j<n ; j++)
{
unsigned int g=0;
for (unsigned int k=0 ; k<n ; k++)
{
if (k!=i)
{
A[j-1][g]=a[j][k]; g++;
}
}
}
res+=a[0][i]*pow(-1, i)*mDeterminant(A, n-1);
Free(A,n-1);
}
return res;
}
}
int main()
{
unsigned int N=4;
double** a=new double*[N];
for (unsigned int i=0 ; i<N ; i++)
{
a[i]=new double[N];
}
for (unsigned int i=0 ; i < N ; i++)
{
for (unsigned int j=0 ; j < N ; j++)
{
a[i][j]=(1+i)*(2+j-i);
cout << a[i][j] << ";";
}
cout << endl;
}
cout << "----------------------------------" << endl;
cout << "mDeterminant = " << mDeterminant(a, N) << endl;
}
我想在JUnit类中测试这个服务:
public class JDBCServiceImpl {
//////
public void writeTablesColumnsToFiles(DataSource dataSource, List<Table> tableInfos) {
ExecutorService executor = Executors.newFixedThreadPool(2);
for (Table table : tableInfos) {
Runnable worker = new Runnable() {
@Override
public void run() {
try {
writeTableColumnsToFiles(dataSource, table);
} catch (Exception ex) {
ex.printStackTrace();
}
}
};
executor.execute(worker);
}
executor.shutdown();
}
//////
public void writeTableColumnsToFiles(DataSource dataSource, Table tableInfo) {
//
try (Connection connection = dataSource.getConnection()) {
.....
}
}
}
JUnit在执行程序完成任务时不等待的主要问题(在调试模式下,我看到在此代码public class JDBCLoaderServiceImpl {
@Test
public void testExecutingOfJDBCService() {
.....
JDBCServiceImpl jdbcLoaderService = new JDBCServiceImpl();
jdbcLoaderService.writeTablesColumnsToFiles(dataSource, allTables);
}
}
服务类返回控制之后)。那么如何解决这个问题呢?提前致谢。
答案 0 :(得分:2)
我建议测试writeTableColumnsToFiles(DataSource dataSource, Table tableInfo)
并忽略使用线程的方法。
但如果你真的想测试它,你可以模拟ExecutorService
并在单线程中完成所有工作。
答案 1 :(得分:0)
通常,JUnit不用于测试多线程执行。 (这是单位测试......就在名称中。)
例如,如果一个甚至所有工作线程都抛出异常而死亡,那么你的JUnit测试工具---在完全不同的线程中运行---就不会注意到了。除非您的测试明确声明没有发生此类故障,否则JUnit会将其记录为已通过,因为测试本身没有抛出或传播任何异常。
答案 2 :(得分:0)
好的,我将下一个代码添加到writeTablesColumnsToFiles
方法:
try {
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
这解决了我的问题。