From cf3f1f287600c221b80850d98cc44c5384f05a6f Mon Sep 17 00:00:00 2001 From: "Damith C. Rajapakse" Date: Mon, 12 Sep 2016 17:09:21 +0800 Subject: [PATCH] Add LO-DI --- doc/Diagrams.pptx | Bin 49640 -> 52381 bytes doc/LearningOutcomes.md | 17 +++++++++++++++++ doc/images/DependencyInjection.png | Bin 0 -> 10343 bytes 3 files changed, 17 insertions(+) create mode 100644 doc/images/DependencyInjection.png diff --git a/doc/Diagrams.pptx b/doc/Diagrams.pptx index a796564d87ed73189a7cba21c42588e46611f379..6e9071e2f2b926fd90e3232d8d6e5731683db2cb 100644 GIT binary patch delta 20127 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 SJP^Xvq0d+7zag%gN&N@=;R{y) delta 17385 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 diff --git a/doc/LearningOutcomes.md b/doc/LearningOutcomes.md index 5a8b4b39d..1cb2e4b01 100644 --- a/doc/LearningOutcomes.md +++ b/doc/LearningOutcomes.md @@ -8,6 +8,7 @@ After studying this code and completing the corresponding exercises, you should 1. [Use abstract classes/methods `[LO-Abstract]`](#use-abstract-classesmethods-lo-abstract) 1. [Follow Liskov Substitution Principle `[LO-LSP]`](#follow-liskov-substitution-principle-lo-lsp) 1. [Use Java-FX for GUI programming `[LO-JavaFx]`](#use-java-fx-for-gui-programming-lo-javafx) +1. [Use Dependency Injection `[LO-DI]`](#use-dependency-injection) @@ -89,3 +90,19 @@ Covered by `[LO-Polymorphism]` ------------------------------------------------------------------------------------------------------ + +## Use Dependency Injection `[LO-DI]` + +#### Exercise: Facilitate injecting a StorageStub + +* Note how `Logic` class depends on the `StorageFile` class. This means when testing the `Logic` class, + our test cases executes the `StorageFile` class as well. What if we want to test the `Logic` class without + getting the `StorageFile` class involved? +* Now, change the implementation as follows so that we can inject a `StorageStub` when testing the `Logic` + class.
+ +* Implement the `StorageStub` to ignore calls to the `save` method. + Update the `LogicTest` to work with the `StorageStub` instead of the actual `StorageFile` object. + +------------------------------------------------------------------------------------------------------ + diff --git a/doc/images/DependencyInjection.png b/doc/images/DependencyInjection.png new file mode 100644 index 0000000000000000000000000000000000000000..562ae6b6a566a39d3d91cab39cae183e73f6489f GIT binary patch literal 10343 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