I am trying to write a unit test for the following method,

public static DateTime addBusinessDays(DateTime startDate, Integer numberOfDays, String businessHoursName){
         Integer numberOfDaysTobeAdded = 8*3600000*numberOfDays;
         BusinessHours bh = getBusinessHourSettings(businessHoursName);
         Datetime endDate = BusinessHours.add(bh.id,startDate,numberOfDaysTobeAdded);
         return endDate;

My questions are:

  1. Why is the salesforce BusinessHours class doesn't support DML operations?
  2. How could I test a BusinessHours class functionality with unit tests? (without querying the BusinessHours?)
  • salesforce.com/developer/docs/api/Content/… Says it is supports create(), getUpdated(), query(), retrieve(), update() So you should be able to insert – TimChadwick Apr 10 '15 at 7:38
  • 6
    It is annoying that you can not do DML operations on BusinessHours. This question should help. – BarCotter Apr 10 '15 at 7:55
  • I Tried This, BusinessHours bh= new BusinessHours( MondayStartTime = Time.newInstance(9, 0, 0, 0), ............ IsActive = true, IsDefault = true ); insert bh; BUT it says DML not allowed on BusinessHours – Hasantha Apr 13 '15 at 5:30
  • I would rename numberOfDaysToBeAdded to millisecondsToBeAdded... – Adrian Larson Dec 16 '15 at 2:44
  • @TimChadwick Have you ever tried it? It is clearly not allowed and there are a fair amount amount of posts about it out there if you do a little googling. – Adrian Larson Dec 16 '15 at 2:47

BusinessHours can't be set up in unit tests.

Best bet is to just set one up in the org and be done with it. Probably all your offices do have a common holiday like 1st January? Then to make your unit test code office-agnostic, you can do something like this:

static Datetime addBusinessDays(Datetime start, Integer time, String office) {

    BusinessHours bh;

    if (Test.isRunningTest()) {
        //for tests
        bh = [SELECT Id FROM BusinessHours LIMIT 1];
    } else {
        //for reals
        bh = [SELECT Id FROM BusinessHours WHERE Name = :office];

    return BusinessHours.add(bh.Id, time, numberOfDays);

Then your test data revolves around 1st January to meaningfully assert the correctness of any calculations you want to perform.

| improve this answer | |

Not the answer you're looking for? Browse other questions tagged or ask your own question.