2017-01-09 1 views
0

Я тестирую простой многопоточный код с использованием EasyMock:Тестирование кода простой многопоточный с использованием EasyMock но получил странный результат

исходный код:

public class EasyMockTest { 

    ExecutorService executorService; 
    TestObject testObject; 

    public EasyMockTest(ExecutorService executorService, TestObject testObject) 
    { 
     this.executorService = executorService; 
     this.testObject = testObject; 
    } 
    public void test() 
    { 
     try 
     { 
      executorService.submit(() ->{ 
       testObject.doSomething(); 
      }); 
     } 
     catch(RejectedExecutionException ex) 
     { 
     } 
    } 
} 


public class TestObject { 

    public void doSomething() 
    { 
    } 
} 

Код испытания с EasyMock:

public class EasyMockTest_test { 

    private TestObject testObject; 
    private ExecutorService executorService; 
    private EasyMockTest easyMockTest; 

    @Before 
    public void setUp() 
    { 
     executorService = new ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(1)); 
     testObject = EasyMock.createMock(TestObject.class); 
     easyMockTest = new EasyMockTest(executorService, testObject); 
    } 

    @Test 
    public void test_easyMockTest() 
    { 
     testObject.doSomething(); 
     EasyMock.expectLastCall().andAnswer(new IAnswer<Void>(){ 
      @Override 
      public Void answer() throws Throwable { 
       Thread.sleep(100); 
       return null; 
      }}).times(2); 

     EasyMock.replay(testObject); 
     easyMockTest.test(); 
     easyMockTest.test(); 
     easyMockTest.test(); 

     EasyMock.verify(testObject); 
    } 
} 

I думаю, в этом случае testObject.doSomething() следует вызывать только дважды. Поскольку пул потоков имеет один поток, а размер очереди - один, и я пропускаю сначала два потока. Поэтому, когда я отправляю три задания, третий должен быть отклонен, а первые два должны быть вызваны. Но когда я запускаю этот код есть ошибка:

java.lang.AssertionError:
Expectation failure on verify: TestObject.doSomething(): expected: 2, actual: 1 at org.easymock.internal.MocksControl.verify(MocksControl.java:225) at org.easymock.EasyMock.verify(EasyMock.java:2007) ...

Это означает, что метод вызывается только один раз, что я не могу понять.

Я также пробовал комментировать Thread.sleep(100); это время фактическое время вызова становится 2, но я думаю, что это должно быть 3, так как нить не спит.

Затем я попытался перемещение & bull; положение(), как это:

EasyMock.expectLastCall().times(2).andAnswer(new IAnswer<Void>(){ 
     @Override 
     public Void answer() throws Throwable { 
      Thread.sleep(100); 
      return null; 
     }}); 

Эта ошибка времени становится:

java.lang.AssertionError: Expectation failure on verify: TestObject.doSomething(): expected: 3, actual: 2

Почему результат ожидает 3, когда я дать ему 2?

Извините, что я не являюсь экспертом по EasyMock, очень ценю, если кто-то может помочь.

ответ

1

Ничто не гарантирует, что ваши задачи будут выполнены до достижения verify. Вам нужно что-то ускорить выполнение.

Это работает:

@Test общественный недействительный test_easyMockTest() бросает InterruptedException { CountDownLatch защелка = новый CountDownLatch (3);

testObject.doSomething(); 
EasyMock.expectLastCall().andAnswer(new IAnswer<Void>(){ 
    @Override 
    public Void answer() throws Throwable { 
    latch.countDown(); 
    return null; 
    }}).times(2); 

EasyMock.replay(testObject); 
easyMockTest.test(); 
easyMockTest.test(); 
easyMockTest.test(); 

latch.await(1, TimeUnit.SECONDS); 

EasyMock.verify(testObject); 

}

Здесь я предполагаю, что вы действительно хотите RejectedExecutionException быть пойманным и игнорируются.

+0

Да, я узнаю причину позже. Спасибо за предложение CountDownLatch! – michael