You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jira@kafka.apache.org by GitBox <gi...@apache.org> on 2022/10/17 17:23:06 UTC

[GitHub] [kafka] divijvaidya commented on a diff in pull request #12739: Replace EasyMock and PowerMock with Mockito | TimeOrderedCachingPersistentWindowStoreTest

divijvaidya commented on code in PR #12739:
URL: https://github.com/apache/kafka/pull/12739#discussion_r997087704


##########
streams/src/test/java/org/apache/kafka/streams/state/internals/TimeOrderedCachingPersistentWindowStoreTest.java:
##########
@@ -1159,58 +1183,42 @@ public void shouldNotThrowInvalidBackwardRangeExceptionWithNegativeFromKey() {
     @Test
     public void shouldCloseCacheAndWrappedStoreAfterErrorDuringCacheFlush() {
         setUpCloseTests();
-        EasyMock.reset(cache);
-        cache.flush(CACHE_NAMESPACE);
-        EasyMock.expectLastCall().andThrow(new RuntimeException("Simulating an error on flush"));
+        reset(cache);
+        doThrow(new RuntimeException("Simulating an error on flush2")).when(cache).flush(CACHE_NAMESPACE);
         cache.close(CACHE_NAMESPACE);
-        EasyMock.replay(cache);
-        EasyMock.reset(underlyingStore);
+        reset(underlyingStore);
         underlyingStore.close();
-        EasyMock.replay(underlyingStore);
-
         assertThrows(RuntimeException.class, cachingStore::close);
-        EasyMock.verify(cache, underlyingStore);
     }
 
     @Test
     public void shouldCloseWrappedStoreAfterErrorDuringCacheClose() {
         setUpCloseTests();
-        EasyMock.reset(cache);
+        reset(cache);
         cache.flush(CACHE_NAMESPACE);
-        cache.close(CACHE_NAMESPACE);
-        EasyMock.expectLastCall().andThrow(new RuntimeException("Simulating an error on close"));
-        EasyMock.replay(cache);
-        EasyMock.reset(underlyingStore);
+        doThrow(new RuntimeException("Simulating an error on close")).when(cache).close(CACHE_NAMESPACE);
+        reset(underlyingStore);
         underlyingStore.close();
-        EasyMock.replay(underlyingStore);
-
         assertThrows(RuntimeException.class, cachingStore::close);
-        EasyMock.verify(cache, underlyingStore);
     }
 
     @Test
     public void shouldCloseCacheAfterErrorDuringStateStoreClose() {
         setUpCloseTests();
-        EasyMock.reset(cache);
+        reset(cache);
         cache.flush(CACHE_NAMESPACE);
         cache.close(CACHE_NAMESPACE);
-        EasyMock.replay(cache);
-        EasyMock.reset(underlyingStore);
-        underlyingStore.close();

Review Comment:
   please verify invocation for this



##########
streams/src/test/java/org/apache/kafka/streams/state/internals/TimeOrderedCachingPersistentWindowStoreTest.java:
##########
@@ -1159,58 +1183,42 @@ public void shouldNotThrowInvalidBackwardRangeExceptionWithNegativeFromKey() {
     @Test
     public void shouldCloseCacheAndWrappedStoreAfterErrorDuringCacheFlush() {
         setUpCloseTests();
-        EasyMock.reset(cache);
-        cache.flush(CACHE_NAMESPACE);
-        EasyMock.expectLastCall().andThrow(new RuntimeException("Simulating an error on flush"));
+        reset(cache);
+        doThrow(new RuntimeException("Simulating an error on flush2")).when(cache).flush(CACHE_NAMESPACE);
         cache.close(CACHE_NAMESPACE);
-        EasyMock.replay(cache);
-        EasyMock.reset(underlyingStore);
+        reset(underlyingStore);
         underlyingStore.close();
-        EasyMock.replay(underlyingStore);
-
         assertThrows(RuntimeException.class, cachingStore::close);
-        EasyMock.verify(cache, underlyingStore);
     }
 
     @Test
     public void shouldCloseWrappedStoreAfterErrorDuringCacheClose() {
         setUpCloseTests();
-        EasyMock.reset(cache);
+        reset(cache);
         cache.flush(CACHE_NAMESPACE);
-        cache.close(CACHE_NAMESPACE);
-        EasyMock.expectLastCall().andThrow(new RuntimeException("Simulating an error on close"));
-        EasyMock.replay(cache);
-        EasyMock.reset(underlyingStore);
+        doThrow(new RuntimeException("Simulating an error on close")).when(cache).close(CACHE_NAMESPACE);
+        reset(underlyingStore);
         underlyingStore.close();
-        EasyMock.replay(underlyingStore);
-
         assertThrows(RuntimeException.class, cachingStore::close);
-        EasyMock.verify(cache, underlyingStore);
     }
 
     @Test
     public void shouldCloseCacheAfterErrorDuringStateStoreClose() {
         setUpCloseTests();
-        EasyMock.reset(cache);
+        reset(cache);
         cache.flush(CACHE_NAMESPACE);

Review Comment:
   This and the following line 1210 could be removed since they are void returning methods on mocks. Instead verify the invocation of these methods using the function I suggested in one of the comments above.
   
   same for other 2 close tests.



##########
streams/src/test/java/org/apache/kafka/streams/state/internals/TimeOrderedCachingPersistentWindowStoreTest.java:
##########
@@ -138,51 +143,70 @@ public void setUp() {
 
     @After
     public void closeStore() {
-        cachingStore.close();
+        try {
+            cachingStore.close();
+        } catch (final RuntimeException runtimeException) {

Review Comment:
   This may hide cases when the exception is genuine.
   
   Alternatively, create a function:
   ```
   private void verifyAndTearDownCloseTests() {
           verify(underlyingStore).close();
           verify(cache).flush(CACHE_NAMESPACE);
           verify(cache).close(CACHE_NAMESPACE);
   
           // resets the mocks created in #setUpCloseTests(). It is necessary to
           // ensure that @After works correctly.
           reset(cache);
           reset(underlyingStore);
       }
   ```
   
   And call it at the end of each close test.



##########
streams/src/test/java/org/apache/kafka/streams/state/internals/TimeOrderedCachingPersistentWindowStoreTest.java:
##########
@@ -90,8 +88,15 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
-
-@RunWith(Parameterized.class)

Review Comment:
   We are removing the ability to run the tests in a parameterized manner. Hence, this test will not for parameters defined in 
   ```
   @Parameterized.Parameters(name = "{0}")
       public static Collection<Object[]> data() {
           return asList(new Object[][] {
               {true},
               {false}
           });
       }
   ```
   
   I understand that you did this because we cannot have two `RunWith` annotations. You can alternatively use 
   ```
   @Rule
       public MockitoRule mockito = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
   ```
   instead of the `@RunWith(MockitoJUnitRunner.StrictStubs.class)`



##########
streams/src/test/java/org/apache/kafka/streams/state/internals/TimeOrderedCachingPersistentWindowStoreTest.java:
##########
@@ -1159,58 +1183,42 @@ public void shouldNotThrowInvalidBackwardRangeExceptionWithNegativeFromKey() {
     @Test
     public void shouldCloseCacheAndWrappedStoreAfterErrorDuringCacheFlush() {
         setUpCloseTests();
-        EasyMock.reset(cache);
-        cache.flush(CACHE_NAMESPACE);
-        EasyMock.expectLastCall().andThrow(new RuntimeException("Simulating an error on flush"));
+        reset(cache);
+        doThrow(new RuntimeException("Simulating an error on flush2")).when(cache).flush(CACHE_NAMESPACE);
         cache.close(CACHE_NAMESPACE);
-        EasyMock.replay(cache);
-        EasyMock.reset(underlyingStore);
+        reset(underlyingStore);
         underlyingStore.close();
-        EasyMock.replay(underlyingStore);
-
         assertThrows(RuntimeException.class, cachingStore::close);
-        EasyMock.verify(cache, underlyingStore);
     }
 
     @Test
     public void shouldCloseWrappedStoreAfterErrorDuringCacheClose() {
         setUpCloseTests();
-        EasyMock.reset(cache);
+        reset(cache);
         cache.flush(CACHE_NAMESPACE);
-        cache.close(CACHE_NAMESPACE);
-        EasyMock.expectLastCall().andThrow(new RuntimeException("Simulating an error on close"));
-        EasyMock.replay(cache);
-        EasyMock.reset(underlyingStore);
+        doThrow(new RuntimeException("Simulating an error on close")).when(cache).close(CACHE_NAMESPACE);
+        reset(underlyingStore);
         underlyingStore.close();
-        EasyMock.replay(underlyingStore);
-
         assertThrows(RuntimeException.class, cachingStore::close);
-        EasyMock.verify(cache, underlyingStore);
     }
 
     @Test
     public void shouldCloseCacheAfterErrorDuringStateStoreClose() {
         setUpCloseTests();
-        EasyMock.reset(cache);
+        reset(cache);
         cache.flush(CACHE_NAMESPACE);
         cache.close(CACHE_NAMESPACE);
-        EasyMock.replay(cache);
-        EasyMock.reset(underlyingStore);
-        underlyingStore.close();
-        EasyMock.expectLastCall().andThrow(new RuntimeException("Simulating an error on close"));
-        EasyMock.replay(underlyingStore);
-
+        reset(underlyingStore);
+        doThrow(new RuntimeException("Simulating an error on close")).when(underlyingStore).close();
         assertThrows(RuntimeException.class, cachingStore::close);
-        EasyMock.verify(cache, underlyingStore);
     }
 
     private void setUpCloseTests() {
-        underlyingStore = EasyMock.createNiceMock(RocksDBTimeOrderedWindowStore.class);
-        EasyMock.expect(underlyingStore.name()).andStubReturn("store-name");
-        EasyMock.expect(underlyingStore.isOpen()).andStubReturn(true);
-        EasyMock.replay(underlyingStore);
-        cachingStore = new TimeOrderedCachingWindowStore(underlyingStore, WINDOW_SIZE, SEGMENT_INTERVAL);
-        cache = EasyMock.createNiceMock(ThreadCache.class);
+        underlyingStore = mock(RocksDBTimeOrderedWindowStore.class);
+        when(underlyingStore.name()).thenReturn("store-name");
+        cachingStore = spy(new TimeOrderedCachingWindowStore(underlyingStore,

Review Comment:
   I wasn't able to understand this change. Why do we need to spy this?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: jira-unsubscribe@kafka.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org