2009 Advent Calendar December 3rd
Let's continue with the same lock interface and MutexLock implementation as yesterday. In order to switch from dependency injection using generics to a classical constructor injection we have to change the important object to something like this:
1: public class ImportantObject
2: {
3: private readonly Lock _lock;
4:
5: public ImportantObject() : this(new MutexLock())
6: {
7:
8: }
9:
10: public ImportantObject(Lock aLock)
11: {
12: _lock = aLock;
13: }
14:
15: public void ImportantMethod()
16: {
17: _lock.Lock();
18: // Do things.
19: _lock.Unlock();
20: }
21: }
Which can be tested like this:
1: public class Given_an_ImportantObject
2: {
3: class FakeLock : Lock
4: {
5: public int NumberOfLocks { get; private set; }
6:
7: public FakeLock()
8: {
9: NumberOfLocks = 0;
10: }
11:
12: public void Lock()
13: {
14: ++NumberOfLocks;
15: }
16:
17: public void Unlock()
18: {
19:
20: }
21: }
22:
23: private ImportantObject _importantObject;
24: private FakeLock _lock;
25:
26: public Given_an_ImportantObject()
27: {
28: _lock = new FakeLock();
29: _importantObject = new ImportantObject(_lock);
30: }
31:
32: [Fact]
33: void It_should_take_lock_when_ImportantMethod_is_called()
34: {
35: _importantObject.ImportantMethod();
36: Assert.Equal(1, _lock.NumberOfLocks);
37: }
38: }
However there is still one big problem with this solution. I'll tell you tomorrow.