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 0000000..3332472 Binary files /dev/null and b/resources/idea/go-settings.jar differ diff --git a/resources/idea/mac-settings.jar b/resources/idea/mac-settings.jar index 5586c2c..b992bf5 100644 Binary files a/resources/idea/mac-settings.jar and b/resources/idea/mac-settings.jar differ diff --git a/src/main/java/me/ehlxr/LambdaTest.java b/src/main/java/me/ehlxr/LambdaTest.java index a88531a..64fe07d 100644 --- a/src/main/java/me/ehlxr/LambdaTest.java +++ b/src/main/java/me/ehlxr/LambdaTest.java @@ -46,5 +46,7 @@ public class LambdaTest { System.out.println("------------求平方和-----new way-----"); System.out.println(list.stream().map(n -> 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