【问题标题】:How to properly mock queue operation in unit test with Mockito?如何使用 Mockito 在单元测试中正确模拟队列操作?
【发布时间】:2018-11-24 04:23:09
【问题描述】:

我有一堂这样的课。 start 方法将在另一个类(如预加载类)中调用

public class Processor implements Runnable{

   private PersistantQueue<object> m_persistentQueue;
   private Thread m_thread;

  //this class is a singleton class

   protected int getQueueSize() {
       return m_persistentQueue.size();
   }


   protected void addToQueue(Object object) {
       m_persistentQueue.add(object);
   }


   public void start() {     
     m_persistentQueue = new PersistantQueue<object>("queueName");
     m_thread = new Thread(new Processor());
     m_thread.start();
   }
 //run method......
}

这是单元测试

  public class AuditEventProcessorTest {

      private Processor m_processor

    @Before
      public void setup() {
         m_Processor = Processor.getProcessorInstance();
         m_Processor.start();
    }
    @After
      //some cleanup after adding items to the queue


   @Test
     public void addToQueue_addSuccessfully() {
     m_Processor.addToQueue(someMockObject);
     assertEquals(1, m_Processor.getQueueSize());
      }
   }

我调用真正的方法将项目添加到队列中。但现在我想模拟队列只是测试逻辑。我不想在单元测试中将项目添加到队列中。如何正确模拟队列?尝试模拟但得到空指针异常。我只能使用 Mockito。请帮我。谢谢!

【问题讨论】:

  • 我认为你的问题的答案可能包含在my article here
  • 如果需要,您可以将处理器类的行为提取到接口中并模拟其方法。请记住,单元测试主要是关于测试业务需求的概念。

标签: java unit-testing junit mockito


【解决方案1】:

SingleTon 模式对单元测试来说有点复杂。在您的情况下,它更复杂,因为您完全隐藏了队列创建逻辑。建议进行一些重构并允许注入和使用spring(如果使用spring)托管单例(如果您只需要单例)bean。依赖注入使单元测试更容易。

如果您想继续使用与问题相同的实现,那么下面是示例,但您需要使用 PowerMockito。

@RunWith(PowerMockRunner.class)
@PrepareForTest(Processor.class)
public class ProcessorTest {

    private Processor processor;
    @Test
    public void test() throws Exception {
        Processor processor = Processor.getInstance();
        ArrayBlockingQueue arrayBlockingQueue = Mockito.mock(ArrayBlockingQueue.class);

        PowerMockito.whenNew(ArrayBlockingQueue.class).withAnyArguments().thenReturn(arrayBlockingQueue);

        processor.start();

        //now you have successfully inject mocked arrayBlockQueue in Processor and can play around with it as usual with any mock object.
    }
}

只需 ArrayBlockingQueue 和您的 PersistantQueue

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 2015-01-31
    • 2011-05-13
    • 2021-03-22
    • 2021-11-19
    相关资源
    最近更新 更多