aboutsummaryrefslogtreecommitdiff
path: root/dexmaker-mockito-inline-tests/src/main/java/com/android/dx/mockito/inline/tests/MockNonPublic.java
diff options
context:
space:
mode:
Diffstat (limited to 'dexmaker-mockito-inline-tests/src/main/java/com/android/dx/mockito/inline/tests/MockNonPublic.java')
-rw-r--r--dexmaker-mockito-inline-tests/src/main/java/com/android/dx/mockito/inline/tests/MockNonPublic.java404
1 files changed, 404 insertions, 0 deletions
diff --git a/dexmaker-mockito-inline-tests/src/main/java/com/android/dx/mockito/inline/tests/MockNonPublic.java b/dexmaker-mockito-inline-tests/src/main/java/com/android/dx/mockito/inline/tests/MockNonPublic.java
new file mode 100644
index 0000000..60b2845
--- /dev/null
+++ b/dexmaker-mockito-inline-tests/src/main/java/com/android/dx/mockito/inline/tests/MockNonPublic.java
@@ -0,0 +1,404 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dx.mockito.inline.tests;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+public class MockNonPublic {
+ private interface SingleMethodInterface {
+ String returnA();
+ }
+
+ private static <T extends Class> void mockSingleMethod(T clazz) {
+ SingleMethodInterface c = (SingleMethodInterface) mock(clazz);
+ assertNull(c.returnA());
+
+ when(c.returnA()).thenReturn("fakeA");
+ assertEquals("fakeA", c.returnA());
+ }
+
+ private static <T extends Class> void spySingleMethod(T clazz) {
+ SingleMethodInterface c = (SingleMethodInterface) spy(clazz);
+ assertEquals("A", c.returnA());
+
+ when(c.returnA()).thenReturn("fakeA");
+ assertEquals("fakeA", c.returnA());
+ }
+
+ private static <T extends SingleMethodInterface> void spyWrappedSingleMethod(T original) {
+ T c = spy(original);
+ assertEquals("A", c.returnA());
+
+ when(c.returnA()).thenReturn("fakeA");
+ assertEquals("fakeA", c.returnA());
+
+ // original is unaffected
+ assertEquals("A", original.returnA());
+ }
+
+ private interface DualMethodInterface {
+ String returnA();
+ String returnB();
+ }
+
+ private static <T extends Class> void mockDualMethod(T clazz) {
+ DualMethodInterface c = (DualMethodInterface) mock(clazz);
+ assertNull(c.returnA());
+ assertNull(c.returnB());
+
+ when(c.returnA()).thenReturn("fakeA");
+ assertEquals("fakeA", c.returnA());
+ assertNull(c.returnB());
+
+ when(c.returnB()).thenReturn("fakeB");
+ assertEquals("fakeA", c.returnA());
+ assertEquals("fakeB", c.returnB());
+ }
+
+ private static <T extends Class> void spyDualMethod(T clazz) {
+ DualMethodInterface c = (DualMethodInterface) spy(clazz);
+ assertEquals("A", c.returnA());
+ assertEquals("B", c.returnB());
+
+ when(c.returnA()).thenReturn("fakeA");
+ assertEquals("fakeA", c.returnA());
+ assertEquals("B", c.returnB());
+
+ when(c.returnB()).thenReturn("fakeB");
+ assertEquals("fakeA", c.returnA());
+ assertEquals("fakeB", c.returnB());
+ }
+
+ private static <T extends DualMethodInterface> void spyWrappedDualMethod(T original) {
+ T c = spy(original);
+ assertEquals("A", c.returnA());
+ assertEquals("B", c.returnB());
+
+ when(c.returnA()).thenReturn("fakeA");
+ assertEquals("fakeA", c.returnA());
+ assertEquals("B", c.returnB());
+
+ when(c.returnB()).thenReturn("fakeB");
+ assertEquals("fakeA", c.returnA());
+ assertEquals("fakeB", c.returnB());
+
+ // original is unaffected
+ assertEquals("A", original.returnA());
+ assertEquals("B", original.returnB());
+ }
+
+ private static class PrivateClass implements SingleMethodInterface {
+ @Override
+ public String returnA() {
+ return "A";
+ }
+ }
+
+ @Test
+ public void mockPrivateClass() {
+ mockSingleMethod(PrivateClass.class);
+ }
+
+ @Test
+ public void spyPrivateClass() {
+ spySingleMethod(PrivateClass.class);
+ }
+
+ @Test
+ public void spyWrappedPrivateClass() {
+ spyWrappedSingleMethod(new PrivateClass());
+ }
+
+ private interface PrivateInterface extends SingleMethodInterface {
+ @Override
+ String returnA();
+ }
+
+ @Test
+ public void mockPrivateInterface() {
+ mockSingleMethod(PrivateInterface.class);
+ }
+
+ private static class SubOfPrivateInterface implements PrivateInterface {
+ @Override
+ public String returnA() {
+ return "A";
+ }
+ }
+
+ @Test
+ public void mockSubOfPrivateInterface() {
+ mockSingleMethod(SubOfPrivateInterface.class);
+ }
+
+ @Test
+ public void spySubOfPrivateInterface() {
+ spySingleMethod(SubOfPrivateInterface.class);
+ }
+
+ @Test
+ public void spyWrappedSubOfPrivateInterface() {
+ spyWrappedSingleMethod(new SubOfPrivateInterface());
+ }
+
+ private static abstract class PrivateAbstractClass implements DualMethodInterface {
+ @Override
+ public String returnA() {
+ return "A";
+ }
+
+ @Override
+ public abstract String returnB();
+ }
+
+ @Test
+ public void mockPrivateAbstractClass() {
+ mockDualMethod(PrivateAbstractClass.class);
+ }
+
+ private static class SubOfPrivateAbstractClass extends PrivateAbstractClass {
+ @Override
+ public String returnB() {
+ return "B";
+ }
+ }
+
+ @Test
+ public void mockSubOfPrivateAbstractClass() {
+ mockDualMethod(SubOfPrivateAbstractClass.class);
+ }
+
+ @Test
+ public void spySubOfPrivateAbstractClass() {
+ spyDualMethod(SubOfPrivateAbstractClass.class);
+ }
+
+ @Test
+ public void spyWrappedSubOfPrivateAbstractClass() {
+ spyWrappedDualMethod(new SubOfPrivateAbstractClass());
+ }
+
+ static class PackagePrivateClass implements SingleMethodInterface {
+ @Override
+ public String returnA() {
+ return "A";
+ }
+ }
+
+ @Test
+ public void mockPackagePrivateClass() {
+ mockSingleMethod(PackagePrivateClass.class);
+ }
+
+ static abstract class PackagePrivateAbstractClass implements DualMethodInterface {
+ @Override
+ public String returnA() {
+ return "A";
+ }
+
+ @Override
+ public abstract String returnB();
+ }
+
+ @Test
+ public void mockPackagePrivateAbstractClass() {
+ mockDualMethod(PackagePrivateAbstractClass.class);
+ }
+
+ static class SubOfPackagePrivateAbstractClass extends PackagePrivateAbstractClass {
+ @Override
+ public String returnB() {
+ return "B";
+ }
+ }
+
+ @Test
+ public void mockSubOfPackagePrivateAbstractClass() {
+ mockDualMethod(SubOfPackagePrivateAbstractClass.class);
+ }
+
+ @Test
+ public void spySubOfPackagePrivateAbstractClass() {
+ spyDualMethod(SubOfPackagePrivateAbstractClass.class);
+ }
+
+ @Test
+ public void spyWrappedSubOfPackagePrivateAbstractClass() {
+ spyWrappedDualMethod(new SubOfPackagePrivateAbstractClass());
+ }
+
+ interface PackagePrivateInterface extends SingleMethodInterface {
+ @Override
+ String returnA();
+ }
+
+ @Test
+ public void mockPackagePrivateInterface() {
+ mockSingleMethod(PackagePrivateInterface.class);
+ }
+
+ static class SubOfPackagePrivateInterface implements PackagePrivateInterface {
+ @Override
+ public String returnA() {
+ return "A";
+ }
+ }
+
+ @Test
+ public void mockSubOfPackagePrivateInterface() {
+ mockSingleMethod(SubOfPackagePrivateInterface.class);
+ }
+
+ @Test
+ public void spySubOfPackagePrivateInterface() {
+ spySingleMethod(SubOfPackagePrivateInterface.class);
+ }
+
+ @Test
+ public void spyWrappedSubOfPackagePrivateInterface() {
+ spyWrappedSingleMethod(new SubOfPackagePrivateInterface());
+ }
+
+ // Cannot implement SingleMethodInterface as returnA would have to be public
+ public static class ClassWithPackagePrivateMethod {
+ String returnA() {
+ return "A";
+ }
+ }
+
+ @Test
+ public void mockClassWithPackagePrivateMethod() {
+ ClassWithPackagePrivateMethod c = mock(ClassWithPackagePrivateMethod.class);
+ assertNull(c.returnA());
+
+ when(c.returnA()).thenReturn("fakeA");
+ assertEquals("fakeA", c.returnA());
+ }
+
+ @Test
+ public void spyClassWithPackagePrivateMethod() {
+ ClassWithPackagePrivateMethod c = spy(ClassWithPackagePrivateMethod.class);
+ assertEquals("A", c.returnA());
+
+ when(c.returnA()).thenReturn("fakeA");
+ assertEquals("fakeA", c.returnA());
+ }
+
+ @Test
+ public void spyWrappedClassWithPackagePrivateMethod() {
+ ClassWithPackagePrivateMethod original = new ClassWithPackagePrivateMethod();
+ ClassWithPackagePrivateMethod c = spy(original);
+ assertEquals("A", c.returnA());
+
+ when(c.returnA()).thenReturn("fakeA");
+ assertEquals("fakeA", c.returnA());
+
+ // original is unaffected
+ assertEquals("A", original.returnA());
+ }
+
+ // Cannot implement DualMethodInterface as returnA/returnB would have to be public
+ public static abstract class AbstractClassWithPackagePrivateMethod {
+ String returnA() {
+ return "A";
+ }
+
+ abstract String returnB();
+ }
+
+ @Test
+ public void mockAbstractClassWithPackagePrivateMethod() {
+ AbstractClassWithPackagePrivateMethod c = mock(AbstractClassWithPackagePrivateMethod.class);
+ assertNull(c.returnA());
+ assertNull(c.returnB());
+
+ when(c.returnA()).thenReturn("fakeA");
+ assertEquals("fakeA", c.returnA());
+ assertNull(c.returnB());
+
+ when(c.returnB()).thenReturn("fakeB");
+ assertEquals("fakeA", c.returnA());
+ assertEquals("fakeB", c.returnB());
+ }
+
+ public static class SubOfAbstractClassWithPackagePrivateMethod extends
+ AbstractClassWithPackagePrivateMethod {
+ @Override
+ String returnB() {
+ return "B";
+ }
+ }
+
+ @Test
+ public void mockSubOfAbstractClassWithPackagePrivateMethod() {
+ SubOfAbstractClassWithPackagePrivateMethod c = mock
+ (SubOfAbstractClassWithPackagePrivateMethod.class);
+ assertNull(c.returnA());
+ assertNull(c.returnB());
+
+ when(c.returnA()).thenReturn("fakeA");
+ assertEquals("fakeA", c.returnA());
+ assertNull(c.returnB());
+
+ when(c.returnB()).thenReturn("fakeB");
+ assertEquals("fakeA", c.returnA());
+ assertEquals("fakeB", c.returnB());
+ }
+
+ @Test
+ public void spySubOfAbstractClassWithPackagePrivateMethod() {
+ SubOfAbstractClassWithPackagePrivateMethod c = spy
+ (SubOfAbstractClassWithPackagePrivateMethod.class);
+ assertEquals("A", c.returnA());
+ assertEquals("B", c.returnB());
+
+ when(c.returnA()).thenReturn("fakeA");
+ assertEquals("fakeA", c.returnA());
+ assertEquals("B", c.returnB());
+
+ when(c.returnB()).thenReturn("fakeB");
+ assertEquals("fakeA", c.returnA());
+ assertEquals("fakeB", c.returnB());
+ }
+
+ @Test
+ public void spyWrappedSubOfAbstractClassWithPackagePrivateMethod() {
+ SubOfAbstractClassWithPackagePrivateMethod original = new
+ SubOfAbstractClassWithPackagePrivateMethod();
+ SubOfAbstractClassWithPackagePrivateMethod c = spy(original);
+ assertEquals("A", c.returnA());
+ assertEquals("B", c.returnB());
+
+ when(c.returnA()).thenReturn("fakeA");
+ assertEquals("fakeA", c.returnA());
+ assertEquals("B", c.returnB());
+
+ when(c.returnB()).thenReturn("fakeB");
+ assertEquals("fakeA", c.returnA());
+ assertEquals("fakeB", c.returnB());
+
+ // original is unaffected
+ assertEquals("A", original.returnA());
+ assertEquals("B", original.returnB());
+ }
+}