Skip to content
diffuse edited this page Apr 15, 2021 · 4 revisions

It can be convenient to test your app container consistency in a unit test. This practice makes sure you did not forget to register a bunch of components as you were implementing a new feature.

Let's again register the types defined in the getting started section:

Hypodermic::ContainerBuilder builder;

builder.registerType< LengthPrefixedMessageSerializer >().as< IMessageSerializer >();
builder.registerType< ConsoleMessageWriter >().as< IMessageWriter >();

and validate the ContainerBuilder:

builder.validate();

What happens here? Hypodermic will try to resolve every single registration by applying their rules:

  • Validating IMessageSerializer
    • Build a Container
    • Resolve IMessageSerializer
  • Validating IMessageWriter
    • Build a Container
    • Resolve IMessageWriter

If no exceptions were thrown, the container is correctly configured.

Let's try again, but this time we won't register IMessageSerializer:

Hypodermic::ContainerBuilder builder;

builder.registerType< LengthPrefixedMessageSerializer >();
builder.registerType< ConsoleMessageWriter >().as< IMessageWriter >();

builder.validate();

Have a look at the validation:

  • Validating LengthPrefixedMessageSerializer
    • Build a Container
    • Resolve LengthPrefixedMessageSerializer
  • Validating IMessageWriter
    • Build a Container
    • Resolve IMessageWriter -> exception

Since ConsoleMessageWriter needs to be injected with an IMessageSerializer, the validation of the container throws an exception because it does not know how to instantiate this component. The container is aware of the concrete type LengthPrefixedMessageSerializer, but was not told that it implements IMessageSerializer.

Clone this wiki locally