场景描述:在为标准分页写测试Code的时候,不知道如何去覆盖如下的代码:
// 返回页面是否有下一页布尔值
public Boolean hasNext {
get {
return setCon.getHasNext();
}
set;
}
// 返回页面是否有上一页布尔值
public Boolean hasPrevious {
get {
return setCon.getHasPrevious();
}
set;
}
// 返回当前记录的页面数
public Integer pageNumber {
get {
return setCon.getPageNumber();
}
set;
}
// 返回记录的总条数
public Integer resultSize {
get {
return setCon.getResultSize();
}
set;
}
// 返回上一页记录
public void previous() {
setCon.previous();
}
// 返回下一页记录
public void next() {
setCon.next();
}
经过反复试错,找到了解决方案,如下是完整代码片段:
1. VF Code:
<apex:page controller="TenderInformationPublicityController" showHeader="false" sidebar="false" cache="true" expires="900" title="比选信息公示" id="thePage">
<apex:includeScript value="{!$Resource.jQuery}"/>
<style>
.form{margin: 12px 15px;}
.dataList{margin: 7px 0 10px;}
.noData{height: 70px;line-height: 70px;text-align: center;color: #a1a1a1;}
.selectList{font-size: 75%;height: 20px;}
.width_20{width: 20%;}
</style>
<apex:insert name="header">
<c:SiteHeader />
</apex:insert>
<!--loading组件-->
<c:StatusSpinner />
<apex:form styleClass="form" id="theForm">
<!-- <apex:pageMessages /> -->
<apex:pageBlock title="比选信息公示" id="TenderProject">
选择比选项目记录类型:
<apex:selectList value="{! filterId}" size="1">
<apex:selectOptions value="{! listViewOptions}" />
<apex:actionSupport event="onchange" action="{!refreshPage}" reRender="TenderProject" status="LoadingStatusSpinner" />
</apex:selectList>
<apex:pageBlockTable id="thePageBlockTable" styleClass="dataList" value="{! TenderProjects}" var="tp" rendered="{!TenderProjects.size > 0}">
<apex:column headerValue="比选名称" styleClass="width_20" id="theColumn">
<apex:outputLink value="/TenderProjectDetail?id={! tp.Id}" id="link">{! tp.Name}</apex:outputLink>
</apex:column>
<apex:column value="{! tp.Selection_Ratio__c}" styleClass="width_20" />
<apex:column value="{! tp.Selection_Type__c}" styleClass="width_20" />
<apex:column value="{! tp.Tender_Stage__c}" styleClass="width_20" />
<apex:column value="{! tp.CreatedDate}" styleClass="width_20" />
</apex:pageBlockTable>
<apex:outputPanel styleClass="noData" layout="block" rendered="{!TenderProjects.size = 0}">暂无数据</apex:outputPanel>
<!-- Pagination -->
<apex:outputPanel rendered="{!TenderProjects.size > 0}">
<table style="width: 100%">
<tr>
<td style="float: left;width: 150px;">
<!-- Page X of Y -->
<!-- PageNumber:当前页面所在位置,ResultSize:记录总条数,Size:每页记录条数 -->
第 <apex:outputText value="{! PageNumber}/{! CEILING(ResultSize / Size)}" /> 页
</td>
<td align="center" style="width: 100%;text-indent: -150px;">
<!-- Previous Page -->
<!-- active -->
<apex:commandLink action="{! Previous}" value="« 上一页" rendered="{! HasPrevious}" />
<!-- 如果没有上一页就用文本显示,不使用带action的链接 -->
<apex:outputText style="color:#ccc;" value="« 上一页" rendered="{! NOT(HasPrevious)}" />
<!-- Next Page -->
<!-- active -->
<apex:commandLink action="{! Next}" value="下一页 »" rendered="{! HasNext}" />
<!-- 如果没有下一页就用文本显示,不使用带action的链接 -->
<apex:outputText style="color: #ccc;" value="下一页 »" rendered="{! NOT(HasNext)}" />
</td>
<!-- 更改每页记录数,默认为25 -->
<!-- <td align="right">
每页记录条数:
<apex:selectList value="{! size}" size="1">
<apex:selectOptions value="{!paginationSizeOptions}"/>
<apex:actionSupport event="onchange" reRender="TenderProject" action="{!refreshPageSize}" />
</apex:selectList>
</td> -->
</tr>
</table>
</apex:outputPanel>
</apex:pageBlock>
</apex:form>
<script type="text/javascript">
var j$ = jQuery.noConflict();
j$(document).ready(function() {
var accId = sessionStorage.getItem('loginAccID');
j$('a[id*=link]').click(function() {
if(accId != null) {
var href = j$(this).attr('href');
j$(this).attr('href', href+'&accId='+accId);
}
});
});
</script>
</apex:page>
2. Apex Code:
/**********************************************************************
*Name:招标信息公示页面控制器
*Description:自定义招标信息公示页面分页,广告商可以自行选择每页展示记录条数,并能按照记录类型过滤记录,只有定向谈判的供应商才能看到与自己相关的比选项目。
======================================================
History
-------
VERSION AUTHOR DATE DETAIL
1.0 Wilson Xu 2017-05-22 Created
2.0 Wilson Xu 2017-06-23 Modified
***********************************************************************/
public class TenderInformationPublicityController {
public static final Integer DEFAULT_PAGE_SIZE = 25;
public Integer size {get;set;}
public String filterId {get;set;}
public List<SelectOption> listViewOptions {get;set;}
public List<Tender_Project__c> tpList;
public Set<Id> tpIds;
public String query;
// 在构造函数初始化每页展示的记录数
public TenderInformationPublicityController() {
// 查询所有已经发布并不包含定向谈判比选方式的比选项目记录
query = 'SELECT Id, Name, Selection_Ratio__c, Selection_Type__c, Tender_Stage__c, CreatedDate, Is_Published__c ' +
'FROM Tender_Project__c ' +
'WHERE Is_Published__c = true AND Selection_Ratio__c != \'定向谈判\' ' +
'ORDER BY CreatedDate DESC ' +
'LIMIT 500';
// 初始化比选项目记录
tpList = Database.query(query);
// 初始化tpIds变量
tpIds = new Set<Id>();
for(Tender_Project__c tp : tpList) {
tpIds.add(tp.Id);
}
System.debug('已经发布且比选方式不为定向谈判的比选项目Id集合:' + tpIds);
size = DEFAULT_PAGE_SIZE;
// paginationSizeOptions = new List<SelectOption>();
// paginationSizeOptions.add(new SelectOption('15','15'));
// paginationSizeOptions.add(new SelectOption('25','25'));
// paginationSizeOptions.add(new SelectOption('30','30'));
listViewOptions = new List<SelectOption>();
listViewOptions.add(new SelectOption('none', '--全部--'));
List<RecordType> items = [SELECT Name, Id
FROM RecordType
WHERE SObjectType = 'Tender_Project__c' AND isActive = true AND Name LIKE '%普通'
LIMIT 100];
for(RecordType item : items) {
listViewOptions.add(new SelectOption(item.Id, item.Name));
}
}
// 通过query locator实例化标准控制器
public ApexPages.StandardSetController setCon {
get {
if(setCon == null) {
setCon = new ApexPages.StandardSetController(Database.getQueryLocator(query));
}
setCon.setPageSize(size);
return setCon;
}
set;
}
// 返回自定义对象Tender_Project__c的List数据集合
public List<Tender_Project__c> getTenderProjects() {
return (List<Tender_Project__c>)setCon.getRecords();
}
// 返回页面是否有下一页布尔值
public Boolean hasNext {
get {
return setCon.getHasNext();
}
set;
}
// 返回页面是否有上一页布尔值
public Boolean hasPrevious {
get {
return setCon.getHasPrevious();
}
set;
}
// 返回当前记录的页面数
public Integer pageNumber {
get {
return setCon.getPageNumber();
}
set;
}
// 返回记录的总条数
public Integer resultSize {
get {
return setCon.getResultSize();
}
set;
}
// 返回上一页记录
public void previous() {
setCon.previous();
}
// 返回下一页记录
public void next() {
setCon.next();
}
// 改变每一页显示的记录条数
// public PageReference refreshPageSize() {
// system.debug('page size:' + size);
// setCon.setPageSize(size);
// return null;
// }
// 改变每一页显示的记录条数
public PageReference refreshPage() {
size = DEFAULT_PAGE_SIZE;// 只要改变了recordType picklist的值就重置下pageSize的值
if(filterId == 'none') {
setCon = new ApexPages.StandardSetController(Database.getQueryLocator(query));
}else {
// 查询指定的recordType记录|注意filterId写法
String filterQuery = 'SELECT Id, RecordTypeId, Name, Selection_Ratio__c, Selection_Type__c, Tender_Stage__c, CreatedDate, Is_Published__c ' +
'FROM Tender_Project__c ' +
'WHERE RecordTypeId = :filterId AND Id IN :tpIds ORDER BY CreatedDate DESC ' +
'LIMIT 500';
setCon = new ApexPages.StandardSetController(Database.getQueryLocator(filterQuery));
}
System.debug('filterId:' + filterId);
return null;
}
}
3. Test Class Code:
@isTest
private class TenderInformationPublicityControllerTest {
static testMethod void testInfoPublicity() {
Test.startTest();
List<Tender_Project__c> tpList = new List<Tender_Project__c>();
Account acc = new Account(
Name = '供应商1',
Approval_Status__c = ' 审核通过'
);
insert acc;
Tender_Project__c tp1 = new Tender_Project__c(
Name = '比选1',
Selection_Ratio__c = '普通',
Selection_Type__c = '展览展示',
Compare_Stage__c = '项目立项',
RecordTypeId = Schema.SObjectType.Tender_Project__c.getRecordTypeInfosByName().get('展览展示-普通').getRecordTypeId(),
Is_Published__c = true
);
insert tp1;
// tpList.add(tp1);
Tender_Project__c tp2 = new Tender_Project__c(
Name = '比选2',
Selection_Ratio__c = '普通',
Selection_Type__c = '事件行销',
Compare_Stage__c = '项目立项',
RecordTypeId = Schema.SObjectType.Tender_Project__c.getRecordTypeInfosByName().get('事件行销-普通').getRecordTypeId(),
Is_Published__c = true
);
insert tp2;
tpList.add(tp1);
tpList.add(tp2);
// 插入应标记录
Advertiser_Tender_Relationship__c atr1 = new Advertiser_Tender_Relationship__c(
Account__c = acc.Id,
Tender_Project__c = tp1.Id
);
insert atr1;
Advertiser_Tender_Relationship__c atr2 = new Advertiser_Tender_Relationship__c(
Account__c = acc.Id,
Tender_Project__c = tp2.Id
);
insert atr2;
PageReference pageRef = Page.TenderInformationPublicity;
Test.setCurrentPage(pageRef);
TenderInformationPublicityController tpc = new TenderInformationPublicityController();
tpc.size = 2;
tpc.getTenderProjects();
tpc.filterId = tp1.RecordTypeId;
tpc.refreshPage();
boolean hn = tpc.hasNext;
boolean hp = tpc.hasPrevious;
Integer pn = tpc.pageNumber;
Integer rs = tpc.resultSize;
tpc.next();
tpc.previous();
Test.stopTest();
}
}