带有执行程序的JUnit服务类立即返回控制

时间:2015-08-26 11:26:03

标签: java junit executorservice

我有下一个服务类:

    #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); } } 服务类返回控制之后)。那么如何解决这个问题呢?提前致谢。

3 个答案:

答案 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();
}

这解决了我的问题。