From 1266ef7db552c2ba90d9b764a74a2a48751fec33 Mon Sep 17 00:00:00 2001 From: ehlxr Date: Fri, 3 Nov 2017 14:04:13 +0800 Subject: [PATCH] add powermock --- java-utils.iml | 12 +++ pom.xml | 12 +++ resources/idea/go-settings.jar | Bin 0 -> 39632 bytes resources/idea/mac-settings.jar | Bin 49205 -> 49714 bytes src/main/java/me/ehlxr/LambdaTest.java | 2 + src/main/java/me/ehlxr/hashing/Cluster.java | 26 +++++ src/main/java/me/ehlxr/hashing/Entry.java | 14 +++ src/main/java/me/ehlxr/hashing/Main.java | 51 ++++++++++ src/main/java/me/ehlxr/hashing/Server.java | 21 ++++ .../me/ehlxr/hashing/consistent/Cluster.java | 41 ++++++++ .../me/ehlxr/hashing/consistent/Entry.java | 18 ++++ .../me/ehlxr/hashing/consistent/Main.java | 49 ++++++++++ .../me/ehlxr/hashing/consistent/Server.java | 26 +++++ .../me/ehlxr/powermock/ClassDependency.java | 16 ++++ .../me/ehlxr/powermock/ClassUnderTest.java | 44 +++++++++ .../ehlxr/powermock/TestClassUnderTest.java | 90 ++++++++++++++++++ 16 files changed, 422 insertions(+) create mode 100644 resources/idea/go-settings.jar create mode 100644 src/main/java/me/ehlxr/hashing/Cluster.java create mode 100644 src/main/java/me/ehlxr/hashing/Entry.java create mode 100644 src/main/java/me/ehlxr/hashing/Main.java create mode 100644 src/main/java/me/ehlxr/hashing/Server.java create mode 100644 src/main/java/me/ehlxr/hashing/consistent/Cluster.java create mode 100644 src/main/java/me/ehlxr/hashing/consistent/Entry.java create mode 100644 src/main/java/me/ehlxr/hashing/consistent/Main.java create mode 100644 src/main/java/me/ehlxr/hashing/consistent/Server.java create mode 100644 src/main/java/me/ehlxr/powermock/ClassDependency.java create mode 100644 src/main/java/me/ehlxr/powermock/ClassUnderTest.java create mode 100644 src/main/java/me/ehlxr/powermock/TestClassUnderTest.java diff --git a/java-utils.iml b/java-utils.iml index b116e99..fcc4c7d 100644 --- a/java-utils.iml +++ b/java-utils.iml @@ -85,5 +85,17 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 634437b..ae5ba03 100644 --- a/pom.xml +++ b/pom.xml @@ -18,6 +18,7 @@ 1.3.2 utf-8 1.8 + 1.7.1 @@ -231,6 +232,17 @@ commons-io 2.5 + + + org.powermock + powermock-module-junit4 + ${powermock.version} + + + org.powermock + powermock-api-mockito2 + ${powermock.version} + java-utils diff --git a/resources/idea/go-settings.jar b/resources/idea/go-settings.jar new file mode 100644 index 0000000000000000000000000000000000000000..3332472e46199647a4aafbdb176a53047ca67c44 GIT binary patch literal 39632 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

=ic3<%fZV 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 n * n).reduce((x, y) -> x + y).get()); + System.out.println(); + } } diff --git a/src/main/java/me/ehlxr/hashing/Cluster.java b/src/main/java/me/ehlxr/hashing/Cluster.java new file mode 100644 index 0000000..e1738db --- /dev/null +++ b/src/main/java/me/ehlxr/hashing/Cluster.java @@ -0,0 +1,26 @@ +package me.ehlxr.hashing; + +public class Cluster { + private static final int SERVER_SIZE_MAX = 1024; + + private Server[] servers = new Server[SERVER_SIZE_MAX]; + private int size = 0; + + public void put(Entry e) { + int index = e.hashCode() % size; + servers[index].put(e); + } + + public Entry get(Entry e) { + int index = e.hashCode() % size; + return servers[index].get(e); + } + + public boolean addServer(Server s) { + if (size >= SERVER_SIZE_MAX) + return false; + + servers[size++] = s; + return true; + } +} \ No newline at end of file diff --git a/src/main/java/me/ehlxr/hashing/Entry.java b/src/main/java/me/ehlxr/hashing/Entry.java new file mode 100644 index 0000000..d940724 --- /dev/null +++ b/src/main/java/me/ehlxr/hashing/Entry.java @@ -0,0 +1,14 @@ +package me.ehlxr.hashing; + +public class Entry { + private String key; + + Entry(String key) { + this.key = key; + } + + @Override + public String toString() { + return key; + } +} \ No newline at end of file diff --git a/src/main/java/me/ehlxr/hashing/Main.java b/src/main/java/me/ehlxr/hashing/Main.java new file mode 100644 index 0000000..b60769d --- /dev/null +++ b/src/main/java/me/ehlxr/hashing/Main.java @@ -0,0 +1,51 @@ +package me.ehlxr.hashing; + +public class Main { + + public static void main(String[] args) { + Cluster c = createCluster(); + + Entry[] entries = { + new Entry("i"), + new Entry("have"), + new Entry("a"), + new Entry("pen"), + new Entry("an"), + new Entry("apple"), + new Entry("applepen"), + new Entry("pineapple"), + new Entry("pineapplepen"), + new Entry("PPAP") + }; + + for (Entry e : entries) { + c.put(e); + } + + c.addServer(new Server("192.168.0.6")); + + findEntries(c, entries); + + } + + private static Cluster createCluster() { + Cluster c = new Cluster(); + c.addServer(new Server("192.168.0.0")); + c.addServer(new Server("192.168.0.1")); + c.addServer(new Server("192.168.0.2")); + c.addServer(new Server("192.168.0.3")); + c.addServer(new Server("192.168.0.4")); + c.addServer(new Server("192.168.0.5")); + return c; + } + + private static void findEntries(Cluster c, Entry[] entries) { + for (Entry e : entries) { + if (e == c.get(e)) { + System.out.println("重新找到了entry:" + e); + } else { + System.out.println("entry已失效:" + e); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/me/ehlxr/hashing/Server.java b/src/main/java/me/ehlxr/hashing/Server.java new file mode 100644 index 0000000..ce0418c --- /dev/null +++ b/src/main/java/me/ehlxr/hashing/Server.java @@ -0,0 +1,21 @@ +package me.ehlxr.hashing; + +import java.util.*; + +public class Server { + private String name; + private Map entries; + + Server(String name) { + this.name = name; + entries = new HashMap<>(); + } + + public void put(Entry e) { + entries.put(e, e); + } + + public Entry get(Entry e) { + return entries.get(e); + } +} \ No newline at end of file diff --git a/src/main/java/me/ehlxr/hashing/consistent/Cluster.java b/src/main/java/me/ehlxr/hashing/consistent/Cluster.java new file mode 100644 index 0000000..b6f7c9e --- /dev/null +++ b/src/main/java/me/ehlxr/hashing/consistent/Cluster.java @@ -0,0 +1,41 @@ +package me.ehlxr.hashing.consistent; + +import java.util.SortedMap; +import java.util.TreeMap; + +public class Cluster { + private static final int SERVER_SIZE_MAX = 1024; + + private SortedMap servers = new TreeMap<>(); + private int size = 0; + + public void put(Entry e) { + routeServer(e.hashCode()).put(e); + } + + public Entry get(Entry e) { + return routeServer(e.hashCode()).get(e); + } + + public Server routeServer(int hash) { + if (servers.isEmpty()) + return null; + + if (!servers.containsKey(hash)) { + SortedMap tailMap = servers.tailMap(hash); + hash = tailMap.isEmpty() ? servers.firstKey() : tailMap.firstKey(); + // hash = servers.firstKey(); + } + return servers.get(hash); + } + + public boolean addServer(Server s) { + if (size >= SERVER_SIZE_MAX) + return false; + + servers.put(s.hashCode(), s); + + size++; + return true; + } +} diff --git a/src/main/java/me/ehlxr/hashing/consistent/Entry.java b/src/main/java/me/ehlxr/hashing/consistent/Entry.java new file mode 100644 index 0000000..ebc478f --- /dev/null +++ b/src/main/java/me/ehlxr/hashing/consistent/Entry.java @@ -0,0 +1,18 @@ +package me.ehlxr.hashing.consistent; + +public class Entry { + private String key; + + Entry(String key) { + this.key = key; + } + + @Override + public String toString() { + return key; + } + + public int hashCode() { + return key.hashCode(); + } +} diff --git a/src/main/java/me/ehlxr/hashing/consistent/Main.java b/src/main/java/me/ehlxr/hashing/consistent/Main.java new file mode 100644 index 0000000..68320e8 --- /dev/null +++ b/src/main/java/me/ehlxr/hashing/consistent/Main.java @@ -0,0 +1,49 @@ +package me.ehlxr.hashing.consistent; + +public class Main { + public static void main(String[] args) { + Cluster c = createCluster(); + + Entry[] entries = { + new Entry("i"), + new Entry("have"), + new Entry("a"), + new Entry("pen"), + new Entry("an"), + new Entry("apple"), + new Entry("applepen"), + new Entry("pineapple"), + new Entry("pineapplepen"), + new Entry("PPAP") + }; + + for (Entry e : entries) { + c.put(e); + } + + c.addServer(new Server("achuguniadsfaang")); + findEntries(c, entries); + + } + + private static Cluster createCluster() { + Cluster c = new Cluster(); + c.addServer(new Server("international")); + c.addServer(new Server("china")); + c.addServer(new Server("japanjapan")); + c.addServer(new Server("Amarica")); + c.addServer(new Server("samsungtsisger")); + c.addServer(new Server("achuguniang")); + return c; + } + + private static void findEntries(Cluster c, Entry[] entries) { + for (Entry e : entries) { + if (e == c.get(e)) { + System.out.println("重新找到了entry: " + e); + } else { + System.out.println("entry已失效: " + e); + } + } + } +} diff --git a/src/main/java/me/ehlxr/hashing/consistent/Server.java b/src/main/java/me/ehlxr/hashing/consistent/Server.java new file mode 100644 index 0000000..03e6529 --- /dev/null +++ b/src/main/java/me/ehlxr/hashing/consistent/Server.java @@ -0,0 +1,26 @@ +package me.ehlxr.hashing.consistent; + +import java.util.*; + +public class Server { + private String name; + private Map entries; + + Server(String name) { + this.name = name; + entries = new HashMap<>(); + } + + public void put(Entry e) { + entries.put(e, e); + } + + public Entry get(Entry e) { + return entries.get(e); + } + + public int hashCode() { + return name.hashCode(); + } + +} diff --git a/src/main/java/me/ehlxr/powermock/ClassDependency.java b/src/main/java/me/ehlxr/powermock/ClassDependency.java new file mode 100644 index 0000000..eba62db --- /dev/null +++ b/src/main/java/me/ehlxr/powermock/ClassDependency.java @@ -0,0 +1,16 @@ +package me.ehlxr.powermock; + +/** + * Created by lixiangrong on 2017/11/3. + */ +public class ClassDependency { + public static boolean isExist() { + // do something + return false; + } + + public final boolean isAlive() { + // do something + return false; + } +} \ No newline at end of file diff --git a/src/main/java/me/ehlxr/powermock/ClassUnderTest.java b/src/main/java/me/ehlxr/powermock/ClassUnderTest.java new file mode 100644 index 0000000..9a7ed00 --- /dev/null +++ b/src/main/java/me/ehlxr/powermock/ClassUnderTest.java @@ -0,0 +1,44 @@ +package me.ehlxr.powermock; + +/** + * Created by lixiangrong on 2017/11/3. + */ +import java.io.File; +/** + * Created by lixiangrong on 2017/7/21. + */ +public class ClassUnderTest { + public boolean callArgumentInstance(File file) { + return file.exists(); + } + public boolean callInternalInstance(String path) { + File file = new File(path); + return file.exists(); + } + public boolean callFinalMethod(ClassDependency refer) { + return refer.isAlive(); + } + public boolean callSystemFinalMethod(String str) { + return str.isEmpty(); + } + public boolean callStaticMethod() { + return ClassDependency.isExist(); + } + public String callSystemStaticMethod(String str) { + return System.getProperty(str); + } + public boolean callPrivateMethod() { + return isExist(); + } + public boolean callVoidPrivateMethod(){ + testVoid(); + return true; + } + private boolean isExist() { + // do something + return false; + } + private void testVoid(){ + System.out.println("do nothing"); + } +} \ No newline at end of file diff --git a/src/main/java/me/ehlxr/powermock/TestClassUnderTest.java b/src/main/java/me/ehlxr/powermock/TestClassUnderTest.java new file mode 100644 index 0000000..197d04b --- /dev/null +++ b/src/main/java/me/ehlxr/powermock/TestClassUnderTest.java @@ -0,0 +1,90 @@ +package me.ehlxr.powermock; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.io.File; + +import static org.mockito.ArgumentMatchers.anyString; + +/** + * Created by lixiangrong on 2017/7/21. + */ +@RunWith(PowerMockRunner.class) +public class TestClassUnderTest { + @Test + public void testCallArgumentInstance() { + File file = PowerMockito.mock(File.class); + ClassUnderTest underTest = new ClassUnderTest(); + PowerMockito.when(file.exists()).thenReturn(true); + Assert.assertTrue(underTest.callArgumentInstance(file)); + } + + @Test + @PrepareForTest(ClassUnderTest.class) + public void testCallInternalInstance() throws Exception { + File file = PowerMockito.mock(File.class); + ClassUnderTest underTest = new ClassUnderTest(); + PowerMockito.whenNew(File.class).withArguments("bbb").thenReturn(file); + PowerMockito.when(file.exists()).thenReturn(true); + Assert.assertTrue(underTest.callInternalInstance("bbb")); + } + + @Test + @PrepareForTest(ClassDependency.class) + public void testCallFinalMethod() { + ClassDependency depencency = PowerMockito.mock(ClassDependency.class); + ClassUnderTest underTest = new ClassUnderTest(); + PowerMockito.when(depencency.isAlive()).thenReturn(true); + Assert.assertTrue(underTest.callFinalMethod(depencency)); + } + + @Test + @PrepareForTest(ClassUnderTest.class) + public void testCallSystemFinalMethod() { + String str = PowerMockito.mock(String.class); + ClassUnderTest underTest = new ClassUnderTest(); + PowerMockito.when(str.isEmpty()).thenReturn(false); + Assert.assertFalse(underTest.callSystemFinalMethod(str)); + } + + @Test + @PrepareForTest(ClassDependency.class) + public void testCallStaticMethod() { + ClassUnderTest underTest = new ClassUnderTest(); + PowerMockito.mockStatic(ClassDependency.class); + PowerMockito.when(ClassDependency.isExist()).thenReturn(true); + Assert.assertTrue(underTest.callStaticMethod()); + } + + @Test + @PrepareForTest(ClassUnderTest.class) + public void testCallSystemStaticMethod() { + ClassUnderTest underTest = new ClassUnderTest(); + PowerMockito.mockStatic(System.class); + PowerMockito.when(System.getProperty("aaa")).thenReturn("bbb"); + Assert.assertEquals("bbb", underTest.callSystemStaticMethod("aaa")); + } + + @Test + @PrepareForTest(ClassUnderTest.class) + public void testCallPrivateMethod() throws Exception { + ClassUnderTest underTest = PowerMockito.mock(ClassUnderTest.class); + PowerMockito.when(underTest.callPrivateMethod()).thenCallRealMethod(); + PowerMockito.when(underTest, "isExist", anyString()).thenReturn(true); + Assert.assertTrue(underTest.callPrivateMethod()); + } + + @Test + @PrepareForTest(ClassUnderTest.class) + public void testCallVoidPrivateMethod() throws Exception { + ClassUnderTest underTest = PowerMockito.mock(ClassUnderTest.class); + PowerMockito.when(underTest.callVoidPrivateMethod()).thenCallRealMethod(); + PowerMockito.doNothing().when(underTest, "testVoid"); + Assert.assertTrue(underTest.callVoidPrivateMethod()); + } +} \ No newline at end of file