Use Test.getStandardPricebookId()
to get StandardPriceBookId in Test Class.
//create Account
Account acct = new Account(Name='test',......);
insert acct;
Opportunity oppty = new Opportunity(Name='TestOppty', AccountId=acct.Id,....);
insert oppty;
Product2 elderProd = new Product2(
IsActive = true,
Name = 'Elder Gifts'
);
insert elderProd;
ID standardPBID = Test.getStandardPricebookId();
PricebookEntry standardPrice = new PricebookEntry(
Pricebook2Id = standardPBID,
Product2Id = prod.Id,
UnitPrice = 10000,
IsActive = true
);
insert standardPrice;
List<Pricebook2> standardPB = [select id from Pricebook2 where isStandard=true];
OpportunityLineItem oli = new OpportunityLineItem(
OpportunityId = oppty.Id,
Quantity = 5,
PricebookEntryId = standardPrice.Id,
UnitPrice = 1);
insert oli;
//following code for Custom pricebook
Pricebook2 customPB = new Pricebook2(
Name='Custom Pricebook',
isActive=true
);
insert customPB;
PricebookEntry elderPBE = new PricebookEntry(
Pricebook2Id = customPB.Id,
Product2Id = elderProd.Id,
UnitPrice = 0,
IsActive = true
);
insert elderPBE;
Update
You have to use actual id of Standard Pricebook as you can't insert a standard pricebook via testmethods. Refer this Test.loadData() - undocumented (but useful) behavior loading relationships