Initialize caches lazily, split up tests.

While it makes the code more complicated it is necessary (and maybe even
more efficient) to initialize the caches on the first access:

A parent cache tries to get an instance for all of its children cache
when it is initialized. Unfortunately ALL children implementations
extend on the class of the parent cache and therefore need the parent
class loaded first because they can initialize their caches. That's why
referencing one of the childrens' caches can possibly return null and
that will prevent the parent cache class to be loaded.

If we initialize them lazily we can ensure the classes are already
loaded first before the caches will be initialized.