I so much wanted @AdrianLarson original Json.deserialize answer to be right as it is easy to fabricate but while it works at compile time, at run time, the deserialized `AggregateResult` is empty ( debug displays as `{}` ). So, here's what I did: **Create an AggregateResultProxy object** /** * AggregateResult can't be mocked so wrap with AggregateResultProxy * which can be mocked by test methods. */ public class AggregateResultProxy { Map<String,Object> valuesByAlias = new Map<String,Object> (); public AggregateResultProxy withAggregateResult(AggregateResult groupedResult) { String groupedResultJson = JSON.serialize(groupedResult); this.valuesByAlias = (Map<String,Object>) JSON.deserializeUntyped(groupedResultJson); return this; } public AggregateResultProxy withAliasAndValue(String alias, Object val) { this.valuesByAlias.put(alias,val); return this; } public Map<String,Object> getValuesByAlias() {return this.valuesByAlias;} } **My selector method** *return not a `List<AggregateResult>` but instead a `List<AggregateResultProxy>`* AggregateResultProxy[] mySelectorMethod(...) { AggregateResultProxy[] groupedResultProxies = new List<AggregateResultProxy)(); for (AggregateResult groupedResult: [SELECT COUNT(ID) RECORDCOUNT, Status STATUS FROM Asset WHERE ... GROUP BY Status ] ) { groupedResultProxies.add( new AggregateResultProxy().withAggregateResult(groupedResult)); } return groupedResultProxies; } **My runtime code** public void doStuff() { for (AggregateResultProxy groupedResultProxies :AssetsSelector.newInstance().mySelectorMethod() ) { Map<String,Object> groupedResultProxy = groupedResultProxies.getValuesByAlias(); System.debug('Status=' + groupedResultProxy.get('STATUS')); System.debug('Count=' + groupedResultProxy.get('RECORDCOUNT')); } } which might display Status= Active Count= 23 Status=Canceled Count=6 **and my testmethod** *using ApexMocks (you could of course use your own favorite dependency injection approach)* fflib_ApexMocks mocks = new fflib_ApexMocks(); // given mocked AggregateResults AggregateResultProxy[] mockedGroupedResults = new List<AggregateResultProxy> { new AggregateResultProxy() .withAliasAndValue('STATUS','Active') .withAliasAndValue('RECORDCOUNT', 2), new AggregateResultProxy() .withAliasAndValue('STATUS','Cancelled') .withAliasAndValue('RECORDCOUNT', 7) }; // Given mock selector (stubbed return val) AssetsSelector mocksSelector = (AssetsSelector) mocks.mock(AssetsSelector.class); mocks.startStubbing(); mocks.when(mocksSelector.sObjectType()).thenReturn(Asset.SObjectType); mocks.when(mocksSelector.mySelector(...)) .thenReturn(mockedGroupedResults); mocks.stopStubbing(); // Given mocks injected Application.Selector.setMock(mocksSelector); // When myMethodUnderTestIsCalled myObject.doStuff(); // Then verify ... ...asserts or apexMocks verifies go here