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.

Comments (0)