Регистрация  |  Вход

Проблемы с тестом для контроллера VF: покрытие 75% и "Attempt to de-reference a null object"

Немного не понимаю, как правильно написать тест. Сейчас покрытие 75%, но есть также ошибка System.NullPointerException: Attempt to de-reference a null object. Сам контроллер:

public class VFController {
public VFController(ApexPages.StandardSetController setCon){}

public ApexPages.StandardSetController setCon {
get {
if(setCon == null) {
setCon = new ApexPages.StandardSetController(Database.getQueryLocator(
[SELECT Id, Title__c FROM Tool__c]));
}
String listViewUrl = ApexPages.currentPage().getParameters().get('vfRetURLInSFX');
String listViewId = listViewUrl.substringAfter('filterName=');
//следующие 3 строки не покрываются тестом:
setCon.setPageSize(2000);
setCon.setFilterId(listViewId);
return setCon;
}
set;
}

public List<Tool__c> getTools() {
return (List<Tool__c>) setCon.getRecords();
}
}


Тест для него
Tool__c tool = new Tool__c(Name = 'Test', Title__c = 'Title');
insert tool;

List<Tool__c> tools = [SELECT Id, Title__c FROM Tool__c];

Test.startTest();
Test.setCurrentPage(Page.VfPage);
ApexPages.StandardSetController standardSetController = new ApexPages.StandardSetController(tools);
standardSetController.setSelected(tools);
VFController controller = new VFController(standardSetController);
Test.stopTest();

System.assertEquals('Test', controller.getTools()[0].Name);

Что делает контроллер? При нажатии на кнопку (List button) он выдает страницу со всеми записями, которые отфильтрованы в соответствии с листвью. Я не знаю, как через тест вызвать ретёрн ApexPages.StandardSetController setCon {get;set;} Хелп!

Немного не понимаю, как правильно написать тест. Сейчас покрытие 75%, но есть также ошибка [b]System.NullPointerException: Attempt to de-reference a null object[/b]. Сам контроллер:
[code]
public class VFController {
	public VFController(ApexPages.StandardSetController setCon){}
		
	public ApexPages.StandardSetController setCon {
		get {
			if(setCon == null) {
				setCon = new ApexPages.StandardSetController(Database.getQueryLocator(
					[SELECT Id, Title__c FROM Tool__c]));
			}
			String listViewUrl = ApexPages.currentPage().getParameters().get('vfRetURLInSFX');
			String listViewId = listViewUrl.substringAfter('filterName=');
                        //следующие 3 строки не покрываются тестом:
			setCon.setPageSize(2000);
			setCon.setFilterId(listViewId);
			return setCon;
		}
		set;
	}

	public List<Tool__c> getTools() {
		return (List<Tool__c>) setCon.getRecords();
	}
}
[/code]
Тест для него
[code]
Tool__c tool = new Tool__c(Name = 'Test', Title__c = 'Title');
insert tool;
        
List<Tool__c> tools = [SELECT Id, Title__c FROM Tool__c];
            
Test.startTest();  
Test.setCurrentPage(Page.VfPage);
ApexPages.StandardSetController standardSetController = new ApexPages.StandardSetController(tools);
standardSetController.setSelected(tools);
VFController controller = new VFController(standardSetController);
Test.stopTest();

System.assertEquals('Test', controller.getTools()[0].Name);
[/code]

Что делает контроллер? При нажатии на кнопку (List button) он выдает страницу со всеми записями, которые отфильтрованы в соответствии с листвью. Я не знаю, как через тест вызвать ретёрн [b]ApexPages.StandardSetController setCon {get;set;}[/b] Хелп!

У вас переменная listViewUrl равна null, потому что в тесте вы нигде не дабавляете для страницы параметр с именем vfRetURLInSFX и падает System.NullPointerException: Attempt to de-reference a null object, когда вы пытаетесь сделать substring для null в 11 cстроке.

Параметр в тесте можно добавить к текущей странице вот так

ApexPages.currentPage().getParameters().put('vfRetURLInSFX', <значение>);

У вас переменная listViewUrl равна null, потому что в тесте вы нигде не дабавляете для страницы параметр с именем vfRetURLInSFX и падает System.NullPointerException: Attempt to de-reference a null object, когда вы пытаетесь сделать substring для null в 11 cстроке.

Параметр в тесте можно добавить к текущей странице вот так 

ApexPages.currentPage().getParameters().put('vfRetURLInSFX', <значение>);

Да, спасибо) Я сделала :)

Да, спасибо) Я сделала :)