Bläddra i källkod

Extracted DTO assembling code to separate classes.

Jesper Hammarbäck 18 år sedan
förälder
incheckning
be4f41598e

+ 7
- 57
dddsample/src/main/java/se/citerus/dddsample/service/CargoServiceImpl.java Visa fil

9
 import se.citerus.dddsample.repository.CarrierMovementRepository;
9
 import se.citerus.dddsample.repository.CarrierMovementRepository;
10
 import se.citerus.dddsample.repository.LocationRepository;
10
 import se.citerus.dddsample.repository.LocationRepository;
11
 import se.citerus.dddsample.service.dto.*;
11
 import se.citerus.dddsample.service.dto.*;
12
+import se.citerus.dddsample.service.dto.assembler.CargoRoutingDTOAssembler;
13
+import se.citerus.dddsample.service.dto.assembler.CargoTrackingDTOAssembler;
12
 
14
 
13
 import java.util.ArrayList;
15
 import java.util.ArrayList;
14
 import java.util.List;
16
 import java.util.List;
57
       return null;
59
       return null;
58
     }
60
     }
59
 
61
 
60
-    final DeliveryHistory deliveryHistory = cargo.deliveryHistory();
61
-
62
-    // TODO: use DTO assemblers
63
-    final Location currentLocation = deliveryHistory.currentLocation();
64
-    final CarrierMovement currentCarrierMovement = deliveryHistory.currentCarrierMovement();
65
-    final CargoTrackingDTO dto = new CargoTrackingDTO(
66
-      cargo.trackingId().idString(),
67
-      cargo.origin().toString(),
68
-      cargo.finalDestination().toString(),
69
-      deliveryHistory.status(),
70
-      currentLocation == null ? null : currentLocation.unLocode().idString(),
71
-      currentCarrierMovement == null ? null : currentCarrierMovement.carrierMovementId().idString(),
72
-      cargo.isMisdirected()
73
-    );
74
-
75
-    final List<HandlingEvent> events = deliveryHistory.eventsOrderedByCompletionTime();
76
-    for (HandlingEvent event : events) {
77
-      final CarrierMovement cm = event.carrierMovement();
78
-      final String carrierIdString = (cm == null) ? "" : cm.carrierMovementId().idString();
79
-      dto.addEvent(new HandlingEventDTO(
80
-        event.location().toString(),
81
-        event.type().toString(),
82
-        carrierIdString,
83
-        event.completionTime(),
84
-        cargo.itinerary().isExpected(event)
85
-      ));
86
-    }
87
-    return dto;
88
-
62
+    return new CargoTrackingDTOAssembler().toDTO(cargo);
89
   }
63
   }
90
 
64
 
91
   // TODO: move this to another class?
65
   // TODO: move this to another class?
114
   public List<CargoRoutingDTO> loadAllForRouting() {
88
   public List<CargoRoutingDTO> loadAllForRouting() {
115
     final List<Cargo> allCargos = cargoRepository.findAll();
89
     final List<Cargo> allCargos = cargoRepository.findAll();
116
 
90
 
117
-    // TODO: use DTO assembler
91
+    final CargoRoutingDTOAssembler assembler = new CargoRoutingDTOAssembler();
118
     final List<CargoRoutingDTO> dtoList = new ArrayList<CargoRoutingDTO>(allCargos.size());
92
     final List<CargoRoutingDTO> dtoList = new ArrayList<CargoRoutingDTO>(allCargos.size());
93
+
119
     for (Cargo cargo : allCargos) {
94
     for (Cargo cargo : allCargos) {
120
-      final CargoRoutingDTO dto = new CargoRoutingDTO(
121
-        cargo.trackingId().idString(),
122
-        cargo.origin().toString(),
123
-        cargo.finalDestination().toString()
124
-      );
125
-      for (Leg leg : cargo.itinerary().legs()) {
126
-        dto.addLeg(
127
-          leg.carrierMovement().carrierMovementId().idString(),
128
-          leg.from().unLocode().idString(),
129
-          leg.to().unLocode().idString()
130
-        );
131
-      }
132
-      dtoList.add(dto);
95
+      dtoList.add(assembler.toDTO(cargo));
133
     }
96
     }
134
 
97
 
135
     return dtoList;
98
     return dtoList;
143
       return null;
106
       return null;
144
     }
107
     }
145
 
108
 
146
-    // TODO: use DTO assembler
147
-    final CargoRoutingDTO dto = new CargoRoutingDTO(
148
-      cargo.trackingId().idString(),
149
-      cargo.origin().toString(),
150
-      cargo.finalDestination().toString()
151
-    );
152
-    for (Leg leg : cargo.itinerary().legs()) {
153
-      dto.addLeg(
154
-        leg.carrierMovement().carrierMovementId().idString(),
155
-        leg.from().toString(),
156
-        leg.to().toString()
157
-      );
158
-    }
159
-    return dto;
109
+    return new CargoRoutingDTOAssembler().toDTO(cargo);
160
   }
110
   }
161
 
111
 
162
   @Transactional(readOnly = false)
112
   @Transactional(readOnly = false)

+ 16
- 18
dddsample/src/main/java/se/citerus/dddsample/service/RoutingServiceImpl.java Visa fil

5
 import se.citerus.dddsample.repository.CargoRepository;
5
 import se.citerus.dddsample.repository.CargoRepository;
6
 import se.citerus.dddsample.repository.CarrierMovementRepository;
6
 import se.citerus.dddsample.repository.CarrierMovementRepository;
7
 import se.citerus.dddsample.repository.LocationRepository;
7
 import se.citerus.dddsample.repository.LocationRepository;
8
-import se.citerus.dddsample.service.dto.assembler.DTOAssembler;
9
 import se.citerus.dddsample.service.dto.ItineraryCandidateDTO;
8
 import se.citerus.dddsample.service.dto.ItineraryCandidateDTO;
9
+import se.citerus.dddsample.service.dto.assembler.ItineraryCandidateDTOAssembler;
10
 
10
 
11
 import java.util.ArrayList;
11
 import java.util.ArrayList;
12
 import java.util.Collections;
12
 import java.util.Collections;
27
 
27
 
28
   @Transactional(readOnly = true)
28
   @Transactional(readOnly = true)
29
   public List<ItineraryCandidateDTO> calculatePossibleRoutes(TrackingId trackingId, Specification specification) {
29
   public List<ItineraryCandidateDTO> calculatePossibleRoutes(TrackingId trackingId, Specification specification) {
30
-    Cargo cargo = cargoRepository.find(trackingId);
30
+    final Cargo cargo = cargoRepository.find(trackingId);
31
     if (cargo == null) {
31
     if (cargo == null) {
32
       return Collections.emptyList();
32
       return Collections.emptyList();
33
     }
33
     }
34
+
34
     List<Location> allLocations = locationRepository.findAll();
35
     List<Location> allLocations = locationRepository.findAll();
35
 
36
 
36
     allLocations.remove(cargo.origin());
37
     allLocations.remove(cargo.origin());
37
     allLocations.remove(cargo.finalDestination());
38
     allLocations.remove(cargo.finalDestination());
38
 
39
 
39
-    int candidateCount = getRandomNumberOfCandidates();
40
-    List<ItineraryCandidateDTO> candidates = new ArrayList<ItineraryCandidateDTO>(candidateCount);
40
+    final int candidateCount = getRandomNumberOfCandidates();
41
+    final List<ItineraryCandidateDTO> candidates = new ArrayList<ItineraryCandidateDTO>(candidateCount);
42
+    final ItineraryCandidateDTOAssembler assembler = new ItineraryCandidateDTOAssembler();
41
 
43
 
42
     for (int i = 0; i < candidateCount; i++) {
44
     for (int i = 0; i < candidateCount; i++) {
43
       allLocations = getRandomChunkOfLocations(allLocations);
45
       allLocations = getRandomChunkOfLocations(allLocations);
44
-      List<Leg> legs = new ArrayList<Leg>(allLocations.size() - 1);
45
-
46
-      Location firstLegTo = allLocations.get(0);
46
+      final List<Leg> legs = new ArrayList<Leg>(allLocations.size() - 1);
47
+      final Location firstLegTo = allLocations.get(0);
47
 
48
 
48
-      CarrierMovement cm1 = carrierMovementRepository.find(new CarrierMovementId("CAR_002"));
49
+      final CarrierMovement cm1 = carrierMovementRepository.find(new CarrierMovementId("CAR_002"));
49
       legs.add(new Leg(cm1, cargo.origin(), firstLegTo));
50
       legs.add(new Leg(cm1, cargo.origin(), firstLegTo));
50
 
51
 
51
       for (int j = 0; j < allLocations.size() - 1; j++) {
52
       for (int j = 0; j < allLocations.size() - 1; j++) {
52
-        legs.add(new Leg(
53
-            getRandomCarrierMovement(),
54
-            allLocations.get(j), allLocations.get(j + 1)));
53
+        legs.add(new Leg(getRandomCarrierMovement(), allLocations.get(j), allLocations.get(j + 1)));
55
       }
54
       }
56
 
55
 
57
-      Location lastLegFrom = allLocations.get(allLocations.size() - 1);
56
+      final Location lastLegFrom = allLocations.get(allLocations.size() - 1);
58
       legs.add(new Leg(getRandomCarrierMovement(), lastLegFrom, cargo.finalDestination()));
57
       legs.add(new Leg(getRandomCarrierMovement(), lastLegFrom, cargo.finalDestination()));
59
 
58
 
60
-      Itinerary itinerary = new Itinerary(legs);
61
-
62
-      candidates.add(DTOAssembler.toItineraryCandidateDTO(itinerary));
59
+      final Itinerary itinerary = new Itinerary(legs);
60
+      candidates.add(assembler.toDTO(itinerary));
63
     }
61
     }
64
 
62
 
65
     return candidates;
63
     return candidates;
67
 
65
 
68
   private List<Location> getRandomChunkOfLocations(List<Location> allLocations) {
66
   private List<Location> getRandomChunkOfLocations(List<Location> allLocations) {
69
     Collections.shuffle(allLocations);
67
     Collections.shuffle(allLocations);
70
-    int total = allLocations.size();
71
-    int chunk = total > 4 ? (total - 4) + random.nextInt(5) : total;
68
+    final int total = allLocations.size();
69
+    final int chunk = total > 4 ? (total - 4) + random.nextInt(5) : total;
72
     return allLocations.subList(0, chunk);
70
     return allLocations.subList(0, chunk);
73
   }
71
   }
74
 
72
 
77
   }
75
   }
78
 
76
 
79
   private CarrierMovement getRandomCarrierMovement() {
77
   private CarrierMovement getRandomCarrierMovement() {
80
-    CarrierMovementId id = new CarrierMovementId("CAR_00" + (random.nextInt(9) + 1));
78
+    final CarrierMovementId id = new CarrierMovementId("CAR_00" + (random.nextInt(9) + 1));
81
     return carrierMovementRepository.find(id);
79
     return carrierMovementRepository.find(id);
82
   }
80
   }
83
 
81
 

+ 7
- 0
dddsample/src/main/java/se/citerus/dddsample/service/dto/CargoRoutingDTO.java Visa fil

14
   private final String finalDestination;
14
   private final String finalDestination;
15
   private final List<LegDTO> legs;
15
   private final List<LegDTO> legs;
16
 
16
 
17
+  /**
18
+   * Constructor.
19
+   *
20
+   * @param trackingId
21
+   * @param origin
22
+   * @param finalDestination
23
+   */
17
   public CargoRoutingDTO(final String trackingId, final String origin, final String finalDestination) {
24
   public CargoRoutingDTO(final String trackingId, final String origin, final String finalDestination) {
18
     this.trackingId = trackingId;
25
     this.trackingId = trackingId;
19
     this.origin = origin;
26
     this.origin = origin;

+ 11
- 0
dddsample/src/main/java/se/citerus/dddsample/service/dto/CargoTrackingDTO.java Visa fil

21
   private final StatusCode statusCode;
21
   private final StatusCode statusCode;
22
   private final boolean misdirected;
22
   private final boolean misdirected;
23
 
23
 
24
+  /**
25
+   * Constructor.
26
+   *
27
+   * @param trackingId
28
+   * @param origin
29
+   * @param finalDestination
30
+   * @param statusCode
31
+   * @param currentLocationId
32
+   * @param carrierMovementId
33
+   * @param isMisdirected
34
+   */
24
   public CargoTrackingDTO(final String trackingId, final String origin, final String finalDestination,
35
   public CargoTrackingDTO(final String trackingId, final String origin, final String finalDestination,
25
                           final StatusCode statusCode, final String currentLocationId, final String carrierMovementId,
36
                           final StatusCode statusCode, final String currentLocationId, final String carrierMovementId,
26
                           final boolean isMisdirected) {
37
                           final boolean isMisdirected) {

+ 9
- 0
dddsample/src/main/java/se/citerus/dddsample/service/dto/HandlingEventDTO.java Visa fil

14
   private final Date time;
14
   private final Date time;
15
   private boolean expected;
15
   private boolean expected;
16
 
16
 
17
+  /**
18
+   * Constructor.
19
+   *
20
+   * @param location
21
+   * @param type
22
+   * @param carrier
23
+   * @param time
24
+   * @param expected
25
+   */
17
   public HandlingEventDTO(final String location, final String type, final String carrier, final Date time,
26
   public HandlingEventDTO(final String location, final String type, final String carrier, final Date time,
18
                           final boolean expected) {
27
                           final boolean expected) {
19
     this.location = location;
28
     this.location = location;

+ 5
- 0
dddsample/src/main/java/se/citerus/dddsample/service/dto/ItineraryCandidateDTO.java Visa fil

10
 
10
 
11
   private final List<LegDTO> legs;
11
   private final List<LegDTO> legs;
12
 
12
 
13
+  /**
14
+   * Constructor.
15
+   *
16
+   * @param legs The legs for this itinerary.
17
+   */
13
   public ItineraryCandidateDTO(final List<LegDTO> legs) {
18
   public ItineraryCandidateDTO(final List<LegDTO> legs) {
14
     this.legs = legs;
19
     this.legs = legs;
15
   }
20
   }

+ 7
- 0
dddsample/src/main/java/se/citerus/dddsample/service/dto/LegDTO.java Visa fil

9
   private final String from;
9
   private final String from;
10
   private final String to;
10
   private final String to;
11
 
11
 
12
+  /**
13
+   * Constructor.
14
+   *
15
+   * @param carrierMovementId
16
+   * @param from
17
+   * @param to
18
+   */
12
   public LegDTO(final String carrierMovementId, final String from, final String to) {
19
   public LegDTO(final String carrierMovementId, final String from, final String to) {
13
     this.carrierMovementId = carrierMovementId;
20
     this.carrierMovementId = carrierMovementId;
14
     this.from = from;
21
     this.from = from;

+ 28
- 0
dddsample/src/main/java/se/citerus/dddsample/service/dto/assembler/CargoRoutingDTOAssembler.java Visa fil

1
+package se.citerus.dddsample.service.dto.assembler;
2
+
3
+import se.citerus.dddsample.domain.Cargo;
4
+import se.citerus.dddsample.domain.Leg;
5
+import se.citerus.dddsample.service.dto.CargoRoutingDTO;
6
+
7
+/**
8
+ * Assembler class for the CargoRoutingDTO.
9
+ */
10
+public class CargoRoutingDTOAssembler {
11
+
12
+  public CargoRoutingDTO toDTO(final Cargo cargo) {
13
+    final CargoRoutingDTO dto = new CargoRoutingDTO(
14
+      cargo.trackingId().idString(),
15
+      cargo.origin().toString(),
16
+      cargo.finalDestination().toString()
17
+    );
18
+    for (Leg leg : cargo.itinerary().legs()) {
19
+      dto.addLeg(
20
+        leg.carrierMovement().carrierMovementId().idString(),
21
+        leg.from().toString(),
22
+        leg.to().toString()
23
+      );
24
+    }
25
+    return dto;
26
+  }
27
+
28
+}

+ 46
- 0
dddsample/src/main/java/se/citerus/dddsample/service/dto/assembler/CargoTrackingDTOAssembler.java Visa fil

1
+package se.citerus.dddsample.service.dto.assembler;
2
+
3
+import se.citerus.dddsample.domain.*;
4
+import se.citerus.dddsample.service.dto.CargoTrackingDTO;
5
+import se.citerus.dddsample.service.dto.HandlingEventDTO;
6
+
7
+import java.util.List;
8
+
9
+/**
10
+ * Assembler class for the CargoTrackingDTO.
11
+ */
12
+public class CargoTrackingDTOAssembler {
13
+
14
+  public CargoTrackingDTO toDTO(final Cargo cargo) {
15
+    final DeliveryHistory deliveryHistory = cargo.deliveryHistory();
16
+    final Location currentLocation = deliveryHistory.currentLocation();
17
+    final CarrierMovement currentCarrierMovement = deliveryHistory.currentCarrierMovement();
18
+    final CargoTrackingDTO dto = new CargoTrackingDTO(
19
+      cargo.trackingId().idString(),
20
+      cargo.origin().toString(),
21
+      cargo.finalDestination().toString(),
22
+      deliveryHistory.status(),
23
+      currentLocation == null ? null : currentLocation.unLocode().idString(),
24
+      currentCarrierMovement == null ? null : currentCarrierMovement.carrierMovementId().idString(),
25
+      cargo.isMisdirected()
26
+    );
27
+
28
+    final List<HandlingEvent> events = deliveryHistory.eventsOrderedByCompletionTime();
29
+    for (HandlingEvent event : events) {
30
+      final CarrierMovement cm = event.carrierMovement();
31
+      final String carrierIdString = (cm == null) ? "" : cm.carrierMovementId().idString();
32
+      dto.addEvent(toHandlingEventDTO(cargo, event, carrierIdString));
33
+    }
34
+    return dto;
35
+  }
36
+
37
+  protected HandlingEventDTO toHandlingEventDTO(final Cargo cargo, HandlingEvent event, String carrierIdString) {
38
+    return new HandlingEventDTO(
39
+      event.location().toString(),
40
+      event.type().toString(),
41
+      carrierIdString,
42
+      event.completionTime(),
43
+      cargo.itinerary().isExpected(event)
44
+    );
45
+  }
46
+}

dddsample/src/main/java/se/citerus/dddsample/service/dto/assembler/DTOAssembler.java → dddsample/src/main/java/se/citerus/dddsample/service/dto/assembler/ItineraryCandidateDTOAssembler.java Visa fil

1
-package se.citerus.dddsample.service.dto.assembler;
2
-
3
-import se.citerus.dddsample.domain.Itinerary;
4
-import se.citerus.dddsample.domain.Leg;
5
-import se.citerus.dddsample.domain.CarrierMovementId;
6
-import se.citerus.dddsample.domain.UnLocode;
7
-import se.citerus.dddsample.service.dto.ItineraryCandidateDTO;
8
-import se.citerus.dddsample.service.dto.LegDTO;
9
-
10
-import java.util.ArrayList;
11
-import java.util.List;
12
-
13
-/**
14
- * Handles assembly of DTOs from the domain model.
15
- */
16
-public class DTOAssembler {
17
-
18
-  public static ItineraryCandidateDTO toItineraryCandidateDTO(final Itinerary itinerary) {
19
-    final List<LegDTO> legDTOs = new ArrayList<LegDTO>(itinerary.legs().size());
20
-    for (Leg leg : itinerary.legs()) {
21
-      legDTOs.add(toLegDTO(leg));
22
-    }
23
-    return new ItineraryCandidateDTO(legDTOs);
24
-  }
25
-
26
-  private static LegDTO toLegDTO(final Leg leg) {
27
-    final CarrierMovementId id = leg.carrierMovement().carrierMovementId();
28
-    final UnLocode from = leg.from().unLocode();
29
-    final UnLocode to = leg.to().unLocode();
30
-    return new LegDTO(id.idString(), from.idString(), to.idString());
31
-  }
32
-}
1
+package se.citerus.dddsample.service.dto.assembler;
2
+
3
+import se.citerus.dddsample.domain.CarrierMovementId;
4
+import se.citerus.dddsample.domain.Itinerary;
5
+import se.citerus.dddsample.domain.Leg;
6
+import se.citerus.dddsample.domain.UnLocode;
7
+import se.citerus.dddsample.service.dto.ItineraryCandidateDTO;
8
+import se.citerus.dddsample.service.dto.LegDTO;
9
+
10
+import java.util.ArrayList;
11
+import java.util.List;
12
+
13
+/**
14
+ * Assembler class for the ItineraryCandidateDTO.
15
+ */
16
+public class ItineraryCandidateDTOAssembler {
17
+
18
+  public ItineraryCandidateDTO toDTO(final Itinerary itinerary) {
19
+    final List<LegDTO> legDTOs = new ArrayList<LegDTO>(itinerary.legs().size());
20
+    for (Leg leg : itinerary.legs()) {
21
+      legDTOs.add(toLegDTO(leg));
22
+    }
23
+    return new ItineraryCandidateDTO(legDTOs);
24
+  }
25
+
26
+  protected LegDTO toLegDTO(final Leg leg) {
27
+    final CarrierMovementId id = leg.carrierMovement().carrierMovementId();
28
+    final UnLocode from = leg.from().unLocode();
29
+    final UnLocode to = leg.to().unLocode();
30
+    return new LegDTO(id.idString(), from.idString(), to.idString());
31
+  }
32
+
33
+}

+ 15
- 16
dddsample/src/test/java/se/citerus/dddsample/web/CargoTrackingControllerTest.java Visa fil

35
     response = new MockHttpServletResponse();
35
     response = new MockHttpServletResponse();
36
     session = new MockHttpSession(servletContext);
36
     session = new MockHttpSession(servletContext);
37
     request.setSession(session);
37
     request.setSession(session);
38
-    
38
+
39
     controller = new CargoTrackingController();
39
     controller = new CargoTrackingController();
40
     controller.setFormView("test-form");
40
     controller.setFormView("test-form");
41
     controller.setSuccessView("test-success");
41
     controller.setSuccessView("test-success");
46
     return new EmptyStubCargoService() {
46
     return new EmptyStubCargoService() {
47
 
47
 
48
       public CargoTrackingDTO track(TrackingId trackingId) {
48
       public CargoTrackingDTO track(TrackingId trackingId) {
49
-        Cargo cargo = new Cargo(trackingId, HONGKONG, TOKYO);
50
-        HandlingEvent event = new HandlingEvent(cargo, new Date(10L), new Date(20L), HandlingEvent.Type.RECEIVE, HONGKONG, null);
51
-
52
-        // TODO: use DTO assemblers
53
-        CargoTrackingDTO cargoDTO = new CargoTrackingDTO(
54
-                cargo.trackingId().idString(),
55
-                cargo.origin().unLocode().idString(),
56
-                cargo.finalDestination().unLocode().idString(),
57
-                StatusCode.CLAIMED,
58
-                "AAAAA",
59
-                "BALO",
60
-                false);
49
+        final Cargo cargo = new Cargo(trackingId, HONGKONG, TOKYO);
50
+        final HandlingEvent event = new HandlingEvent(cargo, new Date(10L), new Date(20L), HandlingEvent.Type.RECEIVE, HONGKONG, null);
51
+
52
+        final CargoTrackingDTO cargoDTO = new CargoTrackingDTO(
53
+          cargo.trackingId().idString(),
54
+          cargo.origin().unLocode().idString(),
55
+          cargo.finalDestination().unLocode().idString(),
56
+          StatusCode.CLAIMED,
57
+          "AAAAA",
58
+          "BALO",
59
+          false);
61
         cargoDTO.addEvent(new HandlingEventDTO(
60
         cargoDTO.addEvent(new HandlingEventDTO(
62
           event.location().unLocode().idString(),
61
           event.location().unLocode().idString(),
63
           event.type().toString(),
62
           event.type().toString(),
68
       }
67
       }
69
     };
68
     };
70
   }
69
   }
71
-  
70
+
72
   private CargoService getCargoServiceNullMock() {
71
   private CargoService getCargoServiceNullMock() {
73
     return new EmptyStubCargoService();
72
     return new EmptyStubCargoService();
74
   }
73
   }
86
 
85
 
87
   public void testHandlePost() throws Exception {
86
   public void testHandlePost() throws Exception {
88
     controller.setCargoService(getCargoServiceMock());
87
     controller.setCargoService(getCargoServiceMock());
89
-    request.addParameter("trackingId","JKL456");
88
+    request.addParameter("trackingId", "JKL456");
90
     request.setMethod("POST");
89
     request.setMethod("POST");
91
 
90
 
92
     ModelAndView mav = controller.handleRequest(request, response);
91
     ModelAndView mav = controller.handleRequest(request, response);
102
     controller.setCargoService(getCargoServiceNullMock());
101
     controller.setCargoService(getCargoServiceNullMock());
103
     request.setMethod("POST");
102
     request.setMethod("POST");
104
     request.setParameter("trackingId", "unknown-id");
103
     request.setParameter("trackingId", "unknown-id");
105
-    
104
+
106
     ModelAndView mav = controller.handleRequest(request, response);
105
     ModelAndView mav = controller.handleRequest(request, response);
107
 
106
 
108
     assertEquals("test-form", mav.getViewName());
107
     assertEquals("test-form", mav.getViewName());