There are two ways in which abstract base classes are used.
1/ You are specializing your abstract object, but all clients will use the derived class through it's base interface.
2/ You are using an abstract base class to factor out duplication within objects in your design, and clients use the concrete implementations through their own interfaces.
If you have the first situation, then you actually have an interface defined by the virtual methods in the abstract class that your derived classes are implementing. You should consider making this a real interface, changing your abstract class to be concrete, and take an instance of this interface in it's constructor. Your derived classes then become implementations of this new interface. This means you can now test your previously abstract class using a mock instance of the new interface, and each new implementation through the now public interface. Everything is simple and testable.
If you have the second situation, the your abstract class is working a helper class. Take a look at the functionality it contains. See if any of it can be pushed onto the objects that are being manipulated to minimize this duplication. If you still have anything left, look at making it a helper class that your concrete implementation take in their constructor and remove their base class. This again leads to concrete classes that are simple and easily testable.
As you can tell "I prefer a complex network of simple objects to a simple network of complex objects" -- to quote James Ross