UI testing with MockProject
已回答
In order to be able to test UI elements of my plugin I have registered lots of classes to the MockProject and tested it like that. Is this the recommended way of it, or is it possible to make MockProject load all default project xml components easier then that?
I did that once for intellij 2020.1 then when 2020.2 came I had to change that test setup class of mine, which is a little bit hacky. I am sure there should be a better way of doing that. I would appreciate if anyone posts a better way of doing that.
protected void registerProjectComponents(MockProject project) {
project.getExtensionArea()
.registerExtensionPoint(
DirectoryIndexExcludePolicy.EP_NAME.getName(),
ExcludeCompilerOutputPolicy.class.getName(),
ExtensionPoint.Kind.BEAN_CLASS);
project.getExtensionArea()
.registerExtensionPoint(
BeforeRunTaskProvider.EP_NAME.getName(),
RunConfigurationBeforeRunProvider.class.getName(),
ExtensionPoint.Kind.BEAN_CLASS);
MessageBus myMessageBus = project.getMessageBus();
FileIndexFacade myFileIndexFacade = new MockFileIndexFacade(project);
PsiModificationTrackerImpl modificationTracker = new PsiModificationTrackerImpl(project);
project.registerService(PsiModificationTracker.class, modificationTracker);
project.registerService(FileIndexFacade.class, myFileIndexFacade);
project.registerService(ResolveCache.class, new ResolveCache(myMessageBus));
project.registerService(PsiManager.class, MockPsiManager.class);
project.registerService(SmartPointerManager.class, SmartPointerManagerImpl.class);
PsiManager myPsiManager = PsiManager.getInstance(project);
project.registerService(ResolveScopeManager.class, new MockResolveScopeManager(project));
project.registerService(PsiFileFactory.class, new PsiFileFactoryImpl(myPsiManager));
project.registerService(
CachedValuesManager.class,
new CachedValuesManagerImpl(project, new PsiCachedValuesFactory(myPsiManager)));
project.registerService(PsiDirectoryFactory.class, new PsiDirectoryFactoryImpl(project));
project.registerService(ProjectScopeBuilder.class, ProjectScopeBuilderImpl.class);
project.registerService(DumbService.class, new MockDumbService(project));
project.registerService(CoreEncodingProjectManager.class, CoreEncodingProjectManager.class);
project.registerService(ValueLookupManager.class, ValueLookupManager.class);
project.registerService(DockManager.class, DockManagerImpl.class);
project.registerService(RunContentManager.class, new RunContentManagerImpl(project));
project.registerService(ExecutionManager.class, ExecutionManagerImpl.class);
project.registerService(
RunnerLayoutUi.Factory.class, new RunnerLayoutUiFactoryImpl(project));
project.registerService(
VcsContentAnnotationSettings.class, VcsContentAnnotationSettings.class);
project.registerService(PsiDocumentManager.class, PsiDocumentManagerImpl.class);
project.registerService(FileEditorManager.class, new Mock.MyFileEditorManager());
project.registerService(StartupManager.class, StartupManagerImpl.class);
project.registerService(
LanguageLevelProjectExtension.class, LanguageLevelProjectExtensionImpl.class);
project.registerService(ProjectRootManager.class, ProjectRootManagerImpl.class);
project.registerService(DirectoryIndex.class, DirectoryIndexImpl.class);
project.registerService(ProjectFileIndex.class, ProjectFileIndexImpl.class);
project.registerService(UnloadedModulesListStorage.class, UnloadedModulesListStorage.class);
project.registerService(ModulePointerManager.class, ModulePointerManagerImpl.class);
project.registerService(JavaCodeFragmentFactory.class, JavaCodeFragmentFactoryImpl.class);
project.registerService(TreeAspect.class, new TreeAspect());
PostprocessReformattingAspect postprocessReformattingAspect =
new PostprocessReformattingAspect(project);
project.registerService(PostprocessReformattingAspect.class, postprocessReformattingAspect);
project.registerService(
PomModel.class,
new PomModelImpl(project) {
@Override
public <T extends PomModelAspect> T getModelAspect(@NotNull Class<T> aClass) {
if (PostprocessReformattingAspect.class.isAssignableFrom(aClass)) {
return aClass.cast(postprocessReformattingAspect);
}
return super.getModelAspect(aClass);
}
});
PathMacroManager pmm = new PathMacroManager(new PathMacrosImpl());
project.registerService(PathMacroManager.class, pmm);
IProjectStore projectStore =
new ProjectStoreBase(project) {
ProjectStateStorageManager projectStateStorageManager;
@Override
public void setPath(@NotNull Path path) {}
@NotNull
@Override
public String getProjectName() {
return project.getName();
}
@NotNull
@Override
public StateStorageManagerImpl getStorageManager() {
if (projectStateStorageManager == null) {
projectStateStorageManager =
new ProjectStateStorageManager(pmm, project, false);
}
return projectStateStorageManager;
}
};
project.registerService(IComponentStore.class, projectStore);
project.registerService(SchemeManagerFactory.class, MockSchemeManagerFactory.class);
project.registerService(EditorTracker.class, EditorTracker.class);
project.registerService(ModifiableModelCommitter.class, ModifiableModelCommitter.class);
project.registerService(
CoverageDataManagerImpl.class, new CoverageDataManagerImpl(project));
project.registerService(
ModifiableModelCommitterService.class, new ModifiableModelCommitterServiceUndo());
project.registerService(
JavaPsiImplementationHelper.class, JavaPsiImplementationHelperImpl.class);
super.registerProjectComponents(project);
}
请先登录再写评论。
so I ve got the response in slack instead of MockProject, I ll try using normal ProjectImpl (should be aware of indexing though, dont wanna wait whole jdk indexing just for UI tests).