Better Software - November 2008 - (Page 29) @RunWith(JMock.class) public class PresenterTest { Mockery context = new Mockery(); @Test public void anUnavailableRoomDisablesTheSaveButton() { final MeetingView view = context.mock(MeetingView.class); final RoomScheduler scheduler = context.mock(RoomScheduler.class); final Meeting meeting = new Meeting(); final Presenter presenter = new Presenter(meeting, view, scheduler); // The schedule service will reply with no available capacity context.checking(new Expectations() { { allowing(scheduler).canAcceptCapacityFor(meeting); will(returnValue(false)); one(view).disableSaveButton(); } }); presenter.requiredCapacityChanged(new FakeTextContainer(“225”)); assertEquals(“Should have updated the model’s capacity”, 225, meeting.getCapacity()); } } Listing 3 including the expected capacity and date. The application will check with a scheduling back-end service to determine if the room is available. If it’s not available, the Save button will dim and a message will be displayed. See figure 1 for a sample layout of this dialog. After some quick drawing at a whiteboard, we come up with a rough sketch of the objects involved, as shown in figure 2. Building the Presenter The key to testing presenters is to keep in mind that they are plain old Java code and can be tested like any other Java code with JUnit. A mock-object library like JMock [5] can be used to test the interactions between the presenter and the view components. Let’s tackle a small slice of the following functionality: The user enters a meeting capacity that cannot be scheduled. First, the view will notify the pre- senter that the user changed the value of the capacity text field. The presenter will then ask the RoomScheduler service if it can accept a new meeting with the specified capacity. Finally, the presenter will tell the view to disable the Save button. Listing 3 shows a test for this scenario. This is an interaction-based test using JMock to provide test doubles for the MeetingView and the RoomScheduler. We stub out the scheduler to reply that it cannot accept the capacity for the meeting and expect our view to be told to disable the Save button. Note here that the view ends up being fairly dumb; it does nothing but notify the presenter whenever the required capacity is changed. This code requires that we specify an interface for our view: public interface MeetingView { void disableSaveButton(); } and for our service: public interface RoomScheduler { boolean canAcceptCapacityFor( Meeting meeting); } The code that passes this test is fairly simple, as shown in listing 4. The presenter is responsible for orchestrating the call to the remote service and instructing the view to disable the Save button. Note also that we’re choosing to let the presenter maintain the state of the Meeting object, so that all UI events ultimately modify this object. This is a very simple implementation, but it’s far from the completed design. Our next test would probably check that setting an acceptable capacity enables the Save button and drives us to make either a new enableSaveButton method or a generalized setSaveButtonAvailable method on the view. We’re still testing NOVEMBER 2008 BETTER SOFTWARE www.StickyMinds.com 29 http://www.StickyMinds.com
Table of Contents Feed for the Digital Edition of Better Software - November 2008 Better Software - November 2008 Contents Mark Your Calendar Contributors eLightenment Technically Speaking Code Craft Test Connection Management Chronicles Getting Agile with User-Centered Design Google Web Toolkit Simple Summaries of Complex Projects Product Announcements 10 Things You Might Not Know About … The Last Word Ad Index Better Software - November 2008 Better Software - November 2008 - (Page Intro) Better Software - November 2008 - (Page bellyband1) Better Software - November 2008 - (Page bellyband2) Better Software - November 2008 - Better Software - November 2008 (Page Cover1) Better Software - November 2008 - Better Software - November 2008 (Page Cover2) Better Software - November 2008 - Better Software - November 2008 (Page 1) Better Software - November 2008 - Better Software - November 2008 (Page 2) Better Software - November 2008 - Contents (Page 3) Better Software - November 2008 - Mark Your Calendar (Page 4) Better Software - November 2008 - Mark Your Calendar (Page 5) Better Software - November 2008 - Contributors (Page 6) Better Software - November 2008 - Contributors (Page 7) Better Software - November 2008 - eLightenment (Page 8) Better Software - November 2008 - eLightenment (Page QA1) Better Software - November 2008 - eLightenment (Page QA2) Better Software - November 2008 - eLightenment (Page 9) Better Software - November 2008 - eLightenment (Page 10) Better Software - November 2008 - eLightenment (Page 11) Better Software - November 2008 - eLightenment (Page 12) Better Software - November 2008 - Technically Speaking (Page 13) Better Software - November 2008 - Code Craft (Page 14) Better Software - November 2008 - Code Craft (Page 15) Better Software - November 2008 - Code Craft (Page 16) Better Software - November 2008 - Code Craft (Page 17) Better Software - November 2008 - Test Connection (Page 18) Better Software - November 2008 - Test Connection (Page 19) Better Software - November 2008 - Management Chronicles (Page 20) Better Software - November 2008 - Management Chronicles (Page 21) Better Software - November 2008 - Getting Agile with User-Centered Design (Page 22) Better Software - November 2008 - Getting Agile with User-Centered Design (Page 23) Better Software - November 2008 - Getting Agile with User-Centered Design (Page 24) Better Software - November 2008 - Getting Agile with User-Centered Design (Page 25) Better Software - November 2008 - Google Web Toolkit (Page 26) Better Software - November 2008 - Google Web Toolkit (Page 27) Better Software - November 2008 - Google Web Toolkit (Page 28) Better Software - November 2008 - Google Web Toolkit (Page 29) Better Software - November 2008 - Google Web Toolkit (Page 30) Better Software - November 2008 - Google Web Toolkit (Page 31) Better Software - November 2008 - Google Web Toolkit (Page 32) Better Software - November 2008 - Google Web Toolkit (Page 33) Better Software - November 2008 - Simple Summaries of Complex Projects (Page 34) Better Software - November 2008 - Simple Summaries of Complex Projects (Page 35) Better Software - November 2008 - Simple Summaries of Complex Projects (Page 36) Better Software - November 2008 - Simple Summaries of Complex Projects (Page 37) Better Software - November 2008 - Simple Summaries of Complex Projects (Page 38) Better Software - November 2008 - Simple Summaries of Complex Projects (Page 39) Better Software - November 2008 - Simple Summaries of Complex Projects (Page 40) Better Software - November 2008 - Simple Summaries of Complex Projects (Page 41) Better Software - November 2008 - Product Announcements (Page 42) Better Software - November 2008 - Product Announcements (Page 43) Better Software - November 2008 - Product Announcements (Page 44) Better Software - November 2008 - Product Announcements (Page 45) Better Software - November 2008 - 10 Things You Might Not Know About … (Page 46) Better Software - November 2008 - The Last Word (Page 47) Better Software - November 2008 - Ad Index (Page 48) Better Software - November 2008 - Ad Index (Page Cover3) Better Software - November 2008 - Ad Index (Page Cover4)
For optimal viewing of this digital publication, please enable JavaScript and then refresh the page. If you would like to try to load the digital publication without using Flash Player detection, please click here.