From the docs:
The runAs method doesn’t enforce user permissions or field-level permissions, only record sharing.
Apex code runs in system context so even though the user does not have delete permissions since the delete is done via apex it is allowed.
You could cause it buy using a flag to let the method know toinstead delete the recordrecords twice, and then attempt to delete it again? Not pretty but worksthe second deletion will cause an error:
static testMethod void testDmlException_Delete()
{
List<Case> records = SObjectFactory.create(Case.sObjectType, RECORD_COUNT);
delete records;
DmlException expectedException;
Test.startTest();
try { delete records; }
catch (DmlException dmx) { expectedException = dmx; }
Test.stopTest();
system.assertEquals(RECORD_COUNT, [SELECT count() FROM Case]);
system.assertNotEquals(null, expectedException);
}