1 /* 2 * Copyright (C) 2021 The Dagger Authors. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package dagger.hilt.android; 18 19 import static com.google.common.truth.Truth.assertThat; 20 import static dagger.hilt.android.migration.OptionalInjectCheck.wasInjectedByHilt; 21 import static org.junit.Assert.assertThrows; 22 23 import android.content.Intent; 24 import android.os.Build; 25 import androidx.lifecycle.ViewModelProvider; 26 import androidx.test.core.app.ApplicationProvider; 27 import androidx.test.ext.junit.runners.AndroidJUnit4; 28 import dagger.hilt.android.OptionalInjectTestClasses.NonHiltViewModel; 29 import dagger.hilt.android.OptionalInjectTestClasses.OptionalSubclassActivity; 30 import dagger.hilt.android.OptionalInjectTestClasses.TestActivity; 31 import dagger.hilt.android.OptionalInjectTestClasses.TestBroadcastReceiver; 32 import dagger.hilt.android.OptionalInjectTestClasses.TestFragment; 33 import dagger.hilt.android.OptionalInjectTestClasses.TestIntentService; 34 import dagger.hilt.android.OptionalInjectTestClasses.TestService; 35 import dagger.hilt.android.OptionalInjectTestClasses.TestView; 36 import dagger.hilt.android.OptionalInjectTestClasses.TestViewModel; 37 import dagger.hilt.android.OptionalInjectTestClasses.TestWithFragmentBindingsView; 38 import org.junit.Test; 39 import org.junit.runner.RunWith; 40 import org.robolectric.Robolectric; 41 import org.robolectric.annotation.Config; 42 43 /** Tests that optional inject work without a Hilt root. */ 44 @RunWith(AndroidJUnit4.class) 45 // Robolectric requires Java9 to run API 29 and above, so use API 28 instead 46 @Config(sdk = Build.VERSION_CODES.P) 47 public final class OptionalInjectWithoutHiltTest { 48 @Test testActivityInjection()49 public void testActivityInjection() throws Exception { 50 TestActivity testActivity = Robolectric.setupActivity(TestActivity.class); 51 assertThat(testActivity.testActivityBinding).isNull(); 52 assertThat(testActivity.wasInjectedByHilt()).isFalse(); 53 assertThat(wasInjectedByHilt(testActivity)).isFalse(); 54 } 55 56 @Test testOptionalSubclassActivityInjection()57 public void testOptionalSubclassActivityInjection() throws Exception { 58 OptionalSubclassActivity testActivity = Robolectric.setupActivity( 59 OptionalSubclassActivity.class); 60 assertThat(testActivity.testActivityBinding).isNull(); 61 assertThat(testActivity.testActivitySubclassBinding).isNull(); 62 assertThat(testActivity.wasInjectedByHilt()).isFalse(); 63 assertThat(wasInjectedByHilt(testActivity)).isFalse(); 64 } 65 66 @Test testFragmentInjection()67 public void testFragmentInjection() throws Exception { 68 TestActivity testActivity = Robolectric.setupActivity(TestActivity.class); 69 TestFragment testFragment = new TestFragment(); 70 testActivity.getSupportFragmentManager() 71 .beginTransaction() 72 .add(testFragment, null) 73 .commitNow(); 74 assertThat(testFragment.testFragmentBinding).isNull(); 75 assertThat(testFragment.wasInjectedByHilt()).isFalse(); 76 assertThat(wasInjectedByHilt(testFragment)).isFalse(); 77 } 78 79 @Test testViewInjection()80 public void testViewInjection() throws Exception { 81 TestActivity testActivity = Robolectric.setupActivity(TestActivity.class); 82 TestView testView = new TestView(testActivity); 83 assertThat(testView.testViewBinding).isNull(); 84 assertThat(testView.wasInjectedByHilt()).isFalse(); 85 assertThat(wasInjectedByHilt(testView)).isFalse(); 86 } 87 88 @Test testViewWithFragmentBindingsInjection()89 public void testViewWithFragmentBindingsInjection() throws Exception { 90 TestActivity testActivity = Robolectric.setupActivity(TestActivity.class); 91 TestFragment testFragment = new TestFragment(); 92 testActivity.getSupportFragmentManager() 93 .beginTransaction() 94 .add(testFragment, null) 95 .commitNow(); 96 97 TestWithFragmentBindingsView testView = new TestWithFragmentBindingsView( 98 testFragment.getLayoutInflater().getContext()); 99 assertThat(testView.testViewBinding).isNull(); 100 assertThat(testView.wasInjectedByHilt()).isFalse(); 101 assertThat(wasInjectedByHilt(testView)).isFalse(); 102 } 103 104 @Test testViewModels()105 public void testViewModels() { 106 TestActivity testActivity = Robolectric.setupActivity(TestActivity.class); 107 TestFragment testFragment = new TestFragment(); 108 testActivity.getSupportFragmentManager() 109 .beginTransaction() 110 .add(testFragment, null) 111 .commitNow(); 112 assertThat(new ViewModelProvider(testActivity).get(NonHiltViewModel.class)).isNotNull(); 113 assertThat(new ViewModelProvider(testFragment).get(NonHiltViewModel.class)).isNotNull(); 114 115 // Hilt View Models aren't usable in this case, so check that it throws. 116 RuntimeException activityException = 117 assertThrows( 118 RuntimeException.class, 119 () -> new ViewModelProvider(testFragment).get(TestViewModel.class)); 120 assertThat(activityException) 121 .hasMessageThat() 122 .contains("TestViewModel"); 123 RuntimeException fragmentException = 124 assertThrows( 125 RuntimeException.class, 126 () -> new ViewModelProvider(testFragment).get(TestViewModel.class)); 127 assertThat(fragmentException) 128 .hasMessageThat() 129 .contains("TestViewModel"); 130 } 131 132 @Test testServiceInjection()133 public void testServiceInjection() throws Exception { 134 TestService testService = Robolectric.setupService(TestService.class); 135 assertThat(testService.testAppBinding).isNull(); 136 assertThat(testService.wasInjectedByHilt()).isFalse(); 137 assertThat(wasInjectedByHilt(testService)).isFalse(); 138 } 139 140 @Test testIntentServiceInjection()141 public void testIntentServiceInjection() throws Exception { 142 TestIntentService testIntentService = Robolectric.setupService(TestIntentService.class); 143 assertThat(testIntentService.testAppBinding).isNull(); 144 assertThat(testIntentService.wasInjectedByHilt()).isFalse(); 145 assertThat(wasInjectedByHilt(testIntentService)).isFalse(); 146 } 147 148 @Test testBroadcastReceiverInjection()149 public void testBroadcastReceiverInjection() throws Exception { 150 TestBroadcastReceiver testBroadcastReceiver = new TestBroadcastReceiver(); 151 Intent intent = new Intent(); 152 testBroadcastReceiver.onReceive(ApplicationProvider.getApplicationContext(), intent); 153 assertThat(testBroadcastReceiver.testAppBinding).isNull(); 154 assertThat(testBroadcastReceiver.wasInjectedByHilt()).isFalse(); 155 assertThat(wasInjectedByHilt(testBroadcastReceiver)).isFalse(); 156 } 157 } 158