阻塞队列多线程单元测试

问题描述

我正在为我的多线程代码使用阻塞队列,并且我正在使用这些队列来限制实例数量。

我有一个包含任务逻辑的 Runnable 类。

public class MyRunnable implements Runnable {

    private final Data data;

    private final LinkedBlockingQueue<ClassA> queue1;

    private final LinkedBlockingQueue<ClassB> queue2;

    public MyRunnable(final Data data,final LinkedBlockingQueue<ClassA> queue1,final LinkedBlockingQueue<ClassB> queue2) {
        this.data = data;
        this.queue1 = queue1;
        this.queue2 = queue2;
    }

    @Override
    public void run() {
        ClassA obj1 = null;
        ClassB obj2 = null;

        try {
            obj1 = queue1.take();
            obj2 = queue2.take();
        } catch (InterruptedException e) {
        }

        try {
            final ClassC output = obj1.someMethod(data); //throws exceptions
            obj2.someMethod(output); //throws exceptions
        } catch (final Exception e) {
        }
        enqueueBoth(obj1,obj2);
    }
}

我已经在一个类中声明了 queue1queue2,并且还添加了一些 ClassAClassB 的实例。

执行者服务代码:

 executorService.execute(new MyRunnable(myData,queue1,queue2));

我正在为它编写单元测试以检查这段代码是否是线程安全的。

我尝试过以下单元测试:

    @Mock
    private LinkedBlockingQueue<ClassA> queue1;

    @Mock
    private LinkedBlockingQueue<ClassB> queue2; 

    @Test
    public void run() throws InterruptedException {

        Thread thread1 = new Thread(new Runnable() {
            @SneakyThrows @Override public void run() {
            Data data = Mockito.mock(Data.class);
            ClassA obj1 = Mockito.mock(ClassA.class);
            ClassB obj2 = Mockito.mock(ClassB.class);
            ClassC output = Mockito.mock(ClassC.class);

            MyRunnable myRunnable = new MyRunnable(data,queue2);

            Mockito.when(queue1.take()).thenReturn(obj1);
            Mockito.when(queue2.take()).thenReturn(obj2);
            Mockito.when(obj1.someMethod(data)).thenReturn(output);
            Mockito.doNothing().when(obj2).someMethod(output);
       
            myRunnable.run();

            Mockito.verify(obj1).someMethod(data);
            Mockito.verify(obj2).someMethod(output);
        }
    });

    thread1.start();
    thread1.join();
}

同样在这个测试中又多了一个线程。

MyRunnable 类线程安全吗?我是否为它编写了正确的单元测试? try catch 会阻塞一个线程中的执行是否会干扰另一个线程的执行。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)