I have a number of test methods that call
Test.setMock(WebServiceMock.class, new SomeWebServiceMockImpl());where
These test methods pass when I run the tests via:
- Setup > App Setup > Develop > Apex Test Execution.
- Setup > App Setup > Develop > Apex Classes > class name > Run Tests.
- Eclipse > Run Tests
- the Developer Console Tests tab
However, when I try and create a managed package that includes these tests they fail with the message:
System.CalloutException: You have uncommitted work pending. Please
commit or rollback before calling out
I understand that this message usually appears after performing DML inserts/updates – see Testing HttpCallout with HttpCalloutMock and UnitTest Created Data. As such, I’ve been careful in these test methods not to make any database calls.
Why are these tests failing during the managed package creation but otherwise passing?
I remember reading about this recently but can’t recall where. I suspect it is a known issue. I thought the work around was to execute the Mock tests first, so I moved them all to the top of the class and prefixed them with ‘aaa_’. This didn’t resolve the issue.
From the same thread as Daniel Ballinger’s answer, BBeaird points out that wrapping the mock callouts in
Test.stopTest() also works around the bug.