By following LSP, our code performs consistently regardless of the dependencies we are injecting. Violating LSP, on the other hand, leads us to violate OCP. These violations cause our code to have too much knowledge of the implementations, which in turn breaks the abstraction of the injected dependencies.