是否有任何测试框架或任何其他方法来测试Java中的异步方法?

时间:2016-03-16 03:20:45

标签: java unit-testing testng

我想在java中测试一堆异步函数。我希望有一个功能,主线程等待所有测试完成。这些函数的方法签名如下所示

public class Callback {
    public void onSucess(Result result) {
        return result.getLastName(); 
    }
}

public class client{

    public static void getLastNameAsync(String firstname, Callback cb);

    public static void getLastNameAsync(String middlename, Callback cb);
    ...................................
    ...................................
    ...................................
    Imagine there are more functions like this 
}

我希望能够按如下方式测试客户端类

    public void TestClient(){
        Client client = new Client();
        client.getLastNameAsync("Brandon", new callback());
        client.getLastNameAsync("kyle", new callback());
        ....................
        ....................
        ....................

        Imagine I have to test more functions like this
    }

countDownLatch似乎是一个解决方案但是我需要知道我调用的方法调用的数量,即使我这样做似乎是一个hacky解决方案,因为我需要实例化如下

CountDownLatch latch = new CountDownLatch(#number of methods calls in my TestClient);
The trick again here is knowing #number of methods calls in my TestClient

对任何建议或解决方案持开放态度。

2 个答案:

答案 0 :(得分:4)

静态方法不是你的朋友。我将使用实例类,然后使用Executor作为控制执行是同步还是异步的方法。

对于您的生产代码,请注入一个ThreadPoolExecutor,以便您的逻辑推迟到另一个线程(或多个线程)。但是,在您的测试用例中,使用DirectExecutor在同一个线程中执行逻辑。请参阅java.util.concurrent.Executor的javadoc

这样,您的测试代码就会简单得多。我确定你想测试被调用的逻辑。如果您需要测试它的多线程,那么您也可以开始接近它。但是,如果你不必,那么保持简单将有助于测试。静态方法对此没有帮助。

答案 1 :(得分:0)

是的,这是为ConcurrentUnit创建的。