Я получил это для работы с PowerMock.
testImplementation 'org.powermock:powermock-api-mockito:1.6.6'
testImplementation 'org.powermock:powermock-module-junit4:1.6.6'
Тогда в моем тестовом классе у меня есть ...
@RunWith(PowerMockRunner.class)
@PrepareForTest({ ReportFragment.class })
public class AddEditBeaconActivityTests {
@Test
public void test_onCreate() {
// Mock some data
mockStatic(ReportFragment.class);
MyActivity activity = spy(new MyActivity());
doNothing().when(activity).initScreen();
doNothing().when(activity).setContentView(R.layout.layout);
doReturn(mock(AppCompatDelegate.class)).when(activity).getDelegate();
// Call the method
activity.onCreate(null);
// Verify that it worked
verify(activity, times(1)).setContentView(R.layout.layout);
verify(activity, times(1)).initScreen();
}
}
Тогда вот как выглядит MyActivity.java ...
public class MyActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout);
initScreen();
}
}
Это работает, потому что вы высмеиваете некоторые внутренние методы / классы, которые вызываются, когда вы вызываете super.onCreate (). Более конкретно ...
- Исключение NullPointerException, которое вы видите, заключается в том, что у вашего смоделированного класса нет AppCompatDelegate, и поэтому он пытается его создать. Если вы перешли в поддельный AppCompatDelegate с
doReturn(mock(AppCompatDelegate.class)).when(activity).getDelegate();
, вы можете обойти эту проблему.
- В конце концов SupportActivity попытается позвонить
ReportFragment.injectIfNeededIn(this);
. Простое насмешивание над этим статическим классом с помощью mockStatic (ReportFragment.class) смоделирует этот вызов. Не забудьте добавить две строки в начало вашего класса: @RunWith(PowerMockRunner.class)
и @PrepareForTest({ ReportFragment.class })
Я не собираюсь спорить, следует ли вам издеваться над методом onCreate или нет. Дэвид делает очень веский аргумент. Если вам действительно нужно протестировать метод onCreate в модульных тестах, это должно сработать.