From 463c0e87ec3ed28619d38121cbae50d4826f64f7 Mon Sep 17 00:00:00 2001 From: xy720 <22125576+xy720@users.noreply.github.com> Date: Fri, 17 Jan 2020 14:09:00 +0800 Subject: [PATCH] Replace PowerMock/EasyMock by Jmockit (4/4) (#2784) This commit replaces the PowerMock/EasyMock in our unit tests. (All) --- fe/pom.xml | 24 ---- .../org/apache/doris/catalog/CatalogTest.java | 17 +-- .../doris/common/proc/DbsProcDirTest.java | 99 ++++++++++---- .../apache/doris/http/DorisHttpTestCase.java | 125 +++++++++++++----- .../apache/doris/load/DppSchedulerTest.java | 118 ++++++++--------- .../org/apache/doris/qe/HelpModuleTest.java | 9 +- 6 files changed, 230 insertions(+), 162 deletions(-) diff --git a/fe/pom.xml b/fe/pom.xml index 54e1658c05..a2a3784941 100644 --- a/fe/pom.xml +++ b/fe/pom.xml @@ -139,14 +139,6 @@ under the License. 1.4.1 - - - org.easymock - easymock - 3.2 - test - - com.google.code.gson @@ -340,22 +332,6 @@ under the License. 2.1 - - - org.powermock - powermock-api-easymock - 1.6.1 - test - - - - - org.powermock - powermock-module-junit4 - 1.6.1 - test - - com.google.protobuf diff --git a/fe/src/test/java/org/apache/doris/catalog/CatalogTest.java b/fe/src/test/java/org/apache/doris/catalog/CatalogTest.java index 1f38b1f97a..7d4be388ad 100644 --- a/fe/src/test/java/org/apache/doris/catalog/CatalogTest.java +++ b/fe/src/test/java/org/apache/doris/catalog/CatalogTest.java @@ -17,6 +17,7 @@ package org.apache.doris.catalog; +import mockit.Expectations; import org.apache.doris.alter.AlterJob; import org.apache.doris.alter.AlterJob.JobType; import org.apache.doris.alter.SchemaChangeJob; @@ -30,10 +31,6 @@ import org.apache.doris.meta.MetaContext; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.junit.runner.RunWith; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; import java.io.BufferedInputStream; import java.io.DataInputStream; @@ -49,14 +46,18 @@ import java.util.List; import java.util.Map; import java.util.Random; -@RunWith(PowerMockRunner.class) -@PowerMockIgnore({ "org.apache.log4j.*", "javax.management.*" }) -@PrepareForTest(Catalog.class) public class CatalogTest { @Before public void setUp() { - + MetaContext metaContext = new MetaContext(); + new Expectations(metaContext) { + { + MetaContext.get(); + minTimes = 0; + result = metaContext; + } + }; } public void mkdir(String dirString) { diff --git a/fe/src/test/java/org/apache/doris/common/proc/DbsProcDirTest.java b/fe/src/test/java/org/apache/doris/common/proc/DbsProcDirTest.java index 85c964ab5d..208233ee4b 100644 --- a/fe/src/test/java/org/apache/doris/common/proc/DbsProcDirTest.java +++ b/fe/src/test/java/org/apache/doris/common/proc/DbsProcDirTest.java @@ -17,40 +17,37 @@ package org.apache.doris.common.proc; +import mockit.Expectations; +import mockit.Mocked; import org.apache.doris.catalog.Catalog; import org.apache.doris.catalog.Database; import org.apache.doris.common.AnalysisException; import com.google.common.collect.Lists; -import org.easymock.EasyMock; import org.junit.After; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; import java.util.Arrays; import java.util.List; public class DbsProcDirTest { - private static Database db1; - private static Database db2; + private Database db1; + private Database db2; + @Mocked private Catalog catalog; // construct test case // catalog // | - db1 // | - db2 - @BeforeClass - public static void setUpClass() { - db1 = new Database(10000L, "db1"); - db2 = new Database(10001L, "db2"); - } @Before public void setUp() { - catalog = EasyMock.createNiceMock(Catalog.class); + db1 = new Database(10000L, "db1"); + db2 = new Database(10001L, "db2"); } @After @@ -68,13 +65,33 @@ public class DbsProcDirTest { @Test(expected = AnalysisException.class) public void testLookupNormal() throws AnalysisException { - EasyMock.expect(catalog.getDb("db1")).andReturn(db1); - EasyMock.expect(catalog.getDb("db2")).andReturn(db2); - EasyMock.expect(catalog.getDb("db3")).andReturn(null); - EasyMock.expect(catalog.getDb(db1.getId())).andReturn(db1); - EasyMock.expect(catalog.getDb(db2.getId())).andReturn(db2); - EasyMock.expect(catalog.getDb(10002L)).andReturn(null); - EasyMock.replay(catalog); + new Expectations(catalog) { + { + catalog.getDb("db1"); + minTimes = 0; + result = db1; + + catalog.getDb("db2"); + minTimes = 0; + result = db2; + + catalog.getDb("db3"); + minTimes = 0; + result = null; + + catalog.getDb(db1.getId()); + minTimes = 0; + result = db1; + + catalog.getDb(db2.getId()); + minTimes = 0; + result = db2; + + catalog.getDb(anyLong); + minTimes = 0; + result = null; + } + }; DbsProcDir dir; ProcNodeInterface node; @@ -126,14 +143,37 @@ public class DbsProcDirTest { @Test public void testFetchResultNormal() throws AnalysisException { - EasyMock.expect(catalog.getDbNames()).andReturn(Lists.newArrayList("db1", "db2")); - EasyMock.expect(catalog.getDb("db1")).andReturn(db1); - EasyMock.expect(catalog.getDb("db2")).andReturn(db2); - EasyMock.expect(catalog.getDb("db3")).andReturn(null); - EasyMock.expect(catalog.getDb(db1.getId())).andReturn(db1); - EasyMock.expect(catalog.getDb(db2.getId())).andReturn(db2); - EasyMock.expect(catalog.getDb(10002L)).andReturn(null); - EasyMock.replay(catalog); + new Expectations(catalog) { + { + catalog.getDbNames(); + minTimes = 0; + result = Lists.newArrayList("db1", "db2"); + + catalog.getDb("db1"); + minTimes = 0; + result = db1; + + catalog.getDb("db2"); + minTimes = 0; + result = db2; + + catalog.getDb("db3"); + minTimes = 0; + result = null; + + catalog.getDb(db1.getId()); + minTimes = 0; + result = db1; + + catalog.getDb(db2.getId()); + minTimes = 0; + result = db2; + + catalog.getDb(anyLong); + minTimes = 0; + result = null; + } + }; DbsProcDir dir; ProcResult result; @@ -153,8 +193,13 @@ public class DbsProcDirTest { @Test public void testFetchResultInvalid() throws AnalysisException { - EasyMock.expect(catalog.getDbNames()).andReturn(null); - EasyMock.replay(catalog); + new Expectations(catalog) { + { + catalog.getDbNames(); + minTimes = 0; + result = null; + } + }; DbsProcDir dir; ProcResult result; diff --git a/fe/src/test/java/org/apache/doris/http/DorisHttpTestCase.java b/fe/src/test/java/org/apache/doris/http/DorisHttpTestCase.java index bd21b95032..1ebf412a06 100644 --- a/fe/src/test/java/org/apache/doris/http/DorisHttpTestCase.java +++ b/fe/src/test/java/org/apache/doris/http/DorisHttpTestCase.java @@ -17,6 +17,10 @@ package org.apache.doris.http; +import mockit.Expectations; +import mockit.Mock; +import mockit.MockUp; +import mockit.Mocked; import org.apache.doris.alter.MaterializedViewHandler; import org.apache.doris.alter.SchemaChangeHandler; import org.apache.doris.catalog.Catalog; @@ -38,6 +42,7 @@ import org.apache.doris.catalog.TabletInvertedIndex; import org.apache.doris.catalog.TabletMeta; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.DdlException; +import org.apache.doris.common.jmockit.Deencapsulation; import org.apache.doris.load.Load; import org.apache.doris.mysql.privilege.PaloAuth; import org.apache.doris.persist.EditLog; @@ -47,33 +52,22 @@ import org.apache.doris.system.SystemInfoService; import org.apache.doris.thrift.TStorageMedium; import com.google.common.collect.Lists; -import mockit.internal.startup.Startup; import okhttp3.Credentials; import okhttp3.MediaType; import okhttp3.OkHttpClient; -import org.easymock.EasyMock; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; -import org.junit.runner.RunWith; -import org.powermock.api.easymock.PowerMock; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; import java.net.ServerSocket; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Random; import java.util.concurrent.TimeUnit; import junit.framework.AssertionFailedError; -@RunWith(PowerMockRunner.class) -@PowerMockIgnore({"org.apache.log4j.*", "javax.management.*", "javax.net.ssl.*"}) -@PrepareForTest({Catalog.class}) abstract public class DorisHttpTestCase { public OkHttpClient networkClient = new OkHttpClient.Builder() @@ -114,6 +108,9 @@ abstract public class DorisHttpTestCase { protected String rootAuth = Credentials.basic("root", ""); + @Mocked + private static EditLog editLog; + public static OlapTable newTable(String name) { Catalog.getCurrentInvertedIndex().clear(); Column k1 = new Column("k1", PrimitiveType.BIGINT); @@ -186,9 +183,9 @@ abstract public class DorisHttpTestCase { private static Catalog newDelegateCatalog() { try { - Catalog catalog = EasyMock.createMock(Catalog.class); + Catalog catalog = Deencapsulation.newInstance(Catalog.class); PaloAuth paloAuth = new PaloAuth(); - EasyMock.expect(catalog.getAuth()).andReturn(paloAuth).anyTimes(); + //EasyMock.expect(catalog.getAuth()).andReturn(paloAuth).anyTimes(); Database db = new Database(testDbId, "default_cluster:testDb"); OlapTable table = newTable(TABLE_NAME); db.createTable(table); @@ -196,22 +193,60 @@ abstract public class DorisHttpTestCase { db.createTable(table1); EsTable esTable = newEsTable("es_table"); db.createTable(esTable); - EasyMock.expect(catalog.getDb(db.getId())).andReturn(db).anyTimes(); - EasyMock.expect(catalog.getDb("default_cluster:" + DB_NAME)).andReturn(db).anyTimes(); - EasyMock.expect(catalog.isMaster()).andReturn(true).anyTimes(); - EasyMock.expect(catalog.getDb("default_cluster:emptyDb")).andReturn(null).anyTimes(); - EasyMock.expect(catalog.getDb(EasyMock.isA(String.class))).andReturn(new Database()).anyTimes(); - EasyMock.expect(catalog.getDbNames()).andReturn(Lists.newArrayList("default_cluster:testDb")).anyTimes(); - EasyMock.expect(catalog.getLoadInstance()).andReturn(new Load()).anyTimes(); - EasyMock.expect(catalog.getSchemaChangeHandler()).andReturn(new SchemaChangeHandler()).anyTimes(); - EasyMock.expect(catalog.getRollupHandler()).andReturn(new MaterializedViewHandler()).anyTimes(); - EasyMock.expect(catalog.getEditLog()).andReturn(EasyMock.createMock(EditLog.class)).anyTimes(); - EasyMock.expect(catalog.getClusterDbNames("default_cluster")).andReturn(Lists.newArrayList("default_cluster:testDb")).anyTimes(); - catalog.changeDb(EasyMock.isA(ConnectContext.class), EasyMock.eq("blockDb")); - EasyMock.expectLastCall().andThrow(new DdlException("failed.")).anyTimes(); - catalog.changeDb(EasyMock.isA(ConnectContext.class), EasyMock.isA(String.class)); - catalog.initDefaultCluster(); - EasyMock.replay(catalog); + new Expectations(catalog) { + { + catalog.getAuth(); + minTimes = 0; + result = paloAuth; + + catalog.getDb(db.getId()); + minTimes = 0; + result = db; + + catalog.getDb("default_cluster:" + DB_NAME); + minTimes = 0; + result = db; + + catalog.isMaster(); + minTimes = 0; + result = true; + + catalog.getDb("default_cluster:emptyDb"); + minTimes = 0; + result = null; + + catalog.getDb(anyString); + minTimes = 0; + result = new Database(); + + catalog.getDbNames(); + minTimes = 0; + result = Lists.newArrayList("default_cluster:testDb"); + + catalog.getLoadInstance(); + minTimes = 0; + result = new Load(); + + catalog.getEditLog(); + minTimes = 0; + result = editLog; + + catalog.getClusterDbNames("default_cluster"); + minTimes = 0; + result = Lists.newArrayList("default_cluster:testDb"); + + catalog.changeDb((ConnectContext) any, "blockDb"); + minTimes = 0; + + catalog.changeDb((ConnectContext) any, anyString); + minTimes = 0; + + catalog.initDefaultCluster(); + minTimes = 0; + } + }; + + return catalog; } catch (DdlException e) { return null; @@ -267,12 +302,32 @@ abstract public class DorisHttpTestCase { Catalog catalog = newDelegateCatalog(); SystemInfoService systemInfoService = new SystemInfoService(); TabletInvertedIndex tabletInvertedIndex = new TabletInvertedIndex(); - PowerMock.mockStatic(Catalog.class); - EasyMock.expect(Catalog.getInstance()).andReturn(catalog).anyTimes(); - EasyMock.expect(Catalog.getCurrentCatalog()).andReturn(catalog).anyTimes(); - EasyMock.expect(Catalog.getCurrentSystemInfo()).andReturn(systemInfoService).anyTimes(); - EasyMock.expect(Catalog.getCurrentInvertedIndex()).andReturn(tabletInvertedIndex).anyTimes(); - PowerMock.replay(Catalog.class); + new MockUp() { + @Mock + SchemaChangeHandler getSchemaChangeHandler() { + return new SchemaChangeHandler(); + } + @Mock + MaterializedViewHandler getRollupHandler() { + return new MaterializedViewHandler(); + } + @Mock + Catalog getInstance() { + return catalog; + } + @Mock + Catalog getCurrentCatalog() { + return catalog; + } + @Mock + SystemInfoService getCurrentSystemInfo() { + return systemInfoService; + } + @Mock + TabletInvertedIndex getCurrentInvertedIndex() { + return tabletInvertedIndex; + } + }; assignBackends(); doSetUp(); } diff --git a/fe/src/test/java/org/apache/doris/load/DppSchedulerTest.java b/fe/src/test/java/org/apache/doris/load/DppSchedulerTest.java index f02ea9deb4..82157efc5c 100644 --- a/fe/src/test/java/org/apache/doris/load/DppSchedulerTest.java +++ b/fe/src/test/java/org/apache/doris/load/DppSchedulerTest.java @@ -17,22 +17,18 @@ package org.apache.doris.load; +import mockit.Expectations; +import mockit.Mocked; import org.apache.doris.common.Config; import org.apache.doris.common.util.CommandResult; import org.apache.doris.common.util.UnitTestUtil; import org.apache.doris.common.util.Util; import org.apache.doris.thrift.TEtlState; -import org.easymock.EasyMock; import org.junit.Assert; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; -import org.junit.runner.RunWith; -import org.powermock.api.easymock.PowerMock; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; import java.lang.reflect.Method; import java.util.ArrayList; @@ -42,18 +38,18 @@ import java.util.List; import java.util.Map; import java.util.Set; -@RunWith(PowerMockRunner.class) -@PowerMockIgnore({ "org.apache.log4j.*", "javax.management.*" }) -@PrepareForTest(Util.class) public class DppSchedulerTest { private DppScheduler dppScheduler; + + @Mocked + private Util util; @Before public void setUp() { // mock palo home env - PowerMock.mockStatic(System.class); - EasyMock.expect(System.getenv("DORIS_HOME")).andReturn(".").anyTimes(); - PowerMock.replay(System.class); +// PowerMock.mockStatic(System.class); +// EasyMock.expect(System.getenv("DORIS_HOME")).andReturn(".").anyTimes(); +// PowerMock.replay(System.class); UnitTestUtil.initDppConfig(); dppScheduler = new DppScheduler(Load.dppDefaultConfig); @@ -65,13 +61,16 @@ public class DppSchedulerTest { // mock hadoop count String fileInfos = " 0 1 1000000000 /label2/export/label2.10007.10007.10005\n" + " 0 1 1000000001 /label2/export/label2.10007.10007.10006"; - CommandResult result = new CommandResult(); - result.setReturnCode(0); - result.setStdout(fileInfos); - PowerMock.mockStatic(Util.class); - EasyMock.expect(Util.executeCommand(EasyMock.anyString(), - EasyMock.isA(String[].class))).andReturn(result).times(3); - PowerMock.replay(Util.class); + CommandResult commandResult = new CommandResult(); + commandResult.setReturnCode(0); + commandResult.setStdout(fileInfos); + new Expectations(util) { + { + Util.executeCommand(anyString, (String[]) any); + times = 3; + result = commandResult; + } + }; // get method Method calcReduceNumByInputSize = UnitTestUtil.getPrivateMethod( @@ -94,8 +93,6 @@ public class DppSchedulerTest { Assert.assertTrue(true); } Config.load_input_size_limit_gb = 0; - - PowerMock.verifyAll(); } @Test @@ -140,19 +137,21 @@ public class DppSchedulerTest { + " Map-Reduce Framework\n" + " Map input records=4085933\n" + " Map output bytes=503053858"; - CommandResult result = new CommandResult(); - result.setReturnCode(0); - result.setStdout(jobStatus); - PowerMock.mockStatic(Util.class); - EasyMock.expect(Util.executeCommand(EasyMock.anyString(), - EasyMock.isA(String[].class))).andReturn(result).times(1); - PowerMock.replay(Util.class); + CommandResult commandResult = new CommandResult(); + commandResult.setReturnCode(0); + commandResult.setStdout(jobStatus); + new Expectations(util) { + { + Util.executeCommand(anyString, (String[]) any); + times = 1; + result = commandResult; + } + }; EtlStatus status = dppScheduler.getEtlJobStatus("etlJobId"); Assert.assertEquals(TEtlState.RUNNING, status.getState()); Assert.assertEquals("0", status.getCounters().get("dpp.abnorm.ALL")); Assert.assertEquals("0.9036233", status.getStats().get("map() completion")); - PowerMock.verifyAll(); } @Test @@ -167,53 +166,50 @@ public class DppSchedulerTest { CommandResult failTestDirResult = new CommandResult(); failTestDirResult.setReturnCode(-1); - // success - PowerMock.mockStatic(Util.class); String files = "-rw-r--r-- 3 palo palo 29896160 2015-02-03 13:10 /label_0/export/label_0.32241.32241.0\n" + "-rw-r--r-- 3 palo palo 29896161 2015-02-03 13:10 /label_0/export/label_0.32241.32241.1"; successLsResult.setStdout(files); - EasyMock.expect(Util.executeCommand(EasyMock.anyString(), - EasyMock.isA(String[].class))).andReturn(successLsResult).times(1); - PowerMock.replay(Util.class); + new Expectations(util) { + { + Util.executeCommand(anyString, (String[]) any); + times = 6; + returns( + // success + successLsResult, + // ls fail + failLsResult, + // outputPath not exist + failTestDirResult, + // ls fail + failLsResult, + // success + successTestDirResult, + // fileDir not exist + failTestDirResult + ); + } + }; Map fileMap = dppScheduler.getEtlFiles(outputPath); Assert.assertEquals(2, fileMap.size()); - PowerMock.verifyAll(); - - // ls fail and outputPath not exist - PowerMock.mockStatic(Util.class); - EasyMock.expect(Util.executeCommand(EasyMock.anyString(), - EasyMock.isA(String[].class))).andReturn(failLsResult).times(1); - EasyMock.expect(Util.executeCommand(EasyMock.anyString(), - EasyMock.isA(String[].class))).andReturn(failTestDirResult).times(1); - PowerMock.replay(Util.class); Assert.assertNull(dppScheduler.getEtlFiles(outputPath)); - PowerMock.verifyAll(); - - // ls fail and fileDir not exist - PowerMock.mockStatic(Util.class); - EasyMock.expect(Util.executeCommand(EasyMock.anyString(), - EasyMock.isA(String[].class))).andReturn(failLsResult).times(1); - EasyMock.expect(Util.executeCommand(EasyMock.anyString(), - EasyMock.isA(String[].class))).andReturn(successTestDirResult).times(1); - EasyMock.expect(Util.executeCommand(EasyMock.anyString(), - EasyMock.isA(String[].class))).andReturn(failTestDirResult).times(1); - PowerMock.replay(Util.class); + fileMap = dppScheduler.getEtlFiles(outputPath); Assert.assertNotNull(fileMap); Assert.assertTrue(fileMap.isEmpty()); - PowerMock.verifyAll(); } @Test public void testKillEtlJob() { - CommandResult result = new CommandResult(); - PowerMock.mockStatic(Util.class); - EasyMock.expect(Util.executeCommand(EasyMock.anyString(), - EasyMock.isA(String[].class))).andReturn(result).times(1); - PowerMock.replay(Util.class); + CommandResult commandResult = new CommandResult(); + new Expectations(util) { + { + Util.executeCommand(anyString, (String[]) any); + times = 1; + result = commandResult; + } + }; dppScheduler.killEtlJob("etlJobId"); - PowerMock.verifyAll(); } @Test diff --git a/fe/src/test/java/org/apache/doris/qe/HelpModuleTest.java b/fe/src/test/java/org/apache/doris/qe/HelpModuleTest.java index 981d3c1846..72ab60886f 100644 --- a/fe/src/test/java/org/apache/doris/qe/HelpModuleTest.java +++ b/fe/src/test/java/org/apache/doris/qe/HelpModuleTest.java @@ -17,6 +17,8 @@ package org.apache.doris.qe; +import mockit.Expectations; +import mockit.Injectable; import org.apache.doris.common.UserException; import com.google.common.collect.Lists; @@ -24,10 +26,6 @@ import com.google.common.collect.Maps; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.junit.runner.RunWith; -import org.powermock.core.classloader.annotations.PowerMockIgnore; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; import java.io.IOException; import java.net.URL; @@ -35,9 +33,6 @@ import java.util.Arrays; import java.util.List; import java.util.Map; -@RunWith(PowerMockRunner.class) -@PowerMockIgnore({"javax.management.*", "org.apache.log4j.*"}) -@PrepareForTest({HelpModule.class, HelpObjectLoader.class}) public class HelpModuleTest { private List categories; private List topics;