Skip to main content
Jump to: navigation, search

Difference between revisions of "Riena/Getting Started with Controller Tests"

(Testing the navigation)
(Testing a simple navigation)
Line 51: Line 51:
 
<source lang="java">
 
<source lang="java">
 
public void testNavigateCombo() {
 
public void testNavigateCombo() {
   getMockNavigationProcessor().navigate(EasyMock.eq(getController().getNavigationNode()), EasyMock.eq(new NavigationNodeId("org.eclipse.riena.example.navigate.comboAndList")), (NavigationArgument) EasyMock.isNull());
+
   getMockNavigationProcessor().navigate(EasyMock.eq(getController().getNavigationNode()), EasyMock.eq(new NavigationNodeId("org.eclipse.riena.example.navigate.comboAndList")), (NavigationArgument) EasyMock.isNull());
  
 
   EasyMock.replay(getMockNavigationProcessor());
 
   EasyMock.replay(getMockNavigationProcessor());

Revision as of 04:10, 18 January 2010

Testing your SubModuleControllers is an essential part of assuring the quality of your client application. With Riena's Controller Testing support it is quite easy to find problems in your SubModuleController logic at an early stage.

Prerequisites

In order to set up test cases, the SubModuleController has to be prepared to acquire Ridgets without a bound view. For this the method getRidget(Class<R> ridgetClazz, String id) has to be used in the SubModuleController to test. On the one hand this method wraps getRidget(String id) to return an already known (bound) instance of the Ridget and on the other hand it creates a new instance of the Ridget if run in test mode and no bound widget is existent.

Setting up a test case

All SubModuleControllerTests should extend AbstractSubModuleControllerTest. This class provides the essential operations needed to test a controller. Every test class has to implement the abstract method createController(ISubModuleNode node) where the SubModuleController to test has to be instantiated and returned. Sometimes it is necessary to set a NavigationNode on the SubModuleController (if things like navigation or marker have to be tested). E.g.:

@Override
protected MarkerSubModuleController createController(ISubModuleNode node) {
  MarkerSubModuleController newInst = new MarkerSubModuleController();
  node.setNodeId(new NavigationNodeId("org.eclipse.riena.example.marker"));
  newInst.setNavigationNode(node);
  return newInst;
}

Testing scenarios

This section covers some in-depth examples on how to test your Controllers. More examples can be found in org.eclipse.riena.client.controller.test.

Testing Ridget behavior

The most basic things you might want to test is the logic behind Ridgets. A Ridget can be accessed by calling getController().getRidget(Class<R> ridgetClazz, String id). In addition to the normal methods that can be called on a Ridget, there are some special features for Ridgets in a Controller Test:

  • fireAction() in IActionRidget: simulates the pushing of a Button
  • triggerListener() in ITraverseRidget: simulates the "dragging" (ScaleRidget) or "clicking" (SpinnerRidget) on a TraverseRidget.


Here is an example on how to test simple correlations between Ridgets (see ChoiceSubModuleController from the Riena Example Client):

public void testPriceAstonMartinWithOptions() {
    ISingleChoiceRidget compositeCarModel = getController().getRidget(ISingleChoiceRidget.class, "compositeCarModel");
    IMultipleChoiceRidget compositeCarExtras = getController().getRidget(IMultipleChoiceRidget.class, "compositeCarExtras");
 
    compositeCarModel.setSelection(CarModels.ASTON_MARTIN);
    compositeCarExtras.setSelection(Arrays.asList(CarOptions.FRONT_GUNS, CarOptions.UNDERWATER));
 
    assertEquals(compositeCarModel.getSelection(), CarModels.ASTON_MARTIN);
    assertEquals(compositeCarExtras.getSelection().size(), 2);
    assertEquals(compositeCarExtras.getSelection().get(0), CarOptions.FRONT_GUNS);
    assertEquals(compositeCarExtras.getSelection().get(1), CarOptions.UNDERWATER);
 
    assertEquals(getController().getCarConfig().getPrice(), 150000);
}

Testing the navigation

Another interesting behavior to test is the navigation between SubModuleControllers. Therefore the AbstractSubModuleControllerTest provides a mockNavigationProcessor that can be used to test several navigation conditions.

Testing a simple navigation

public void testNavigateCombo() {
  getMockNavigationProcessor().navigate(EasyMock.eq(getController().getNavigationNode()), EasyMock.eq(new NavigationNodeId("org.eclipse.riena.example.navigate.comboAndList")), (NavigationArgument) EasyMock.isNull());
 
  EasyMock.replay(getMockNavigationProcessor());
 
  IActionRidget navigateToComboButton = getController().getRidget(IActionRidget.class, "comboAndList");
  navigateToComboButton.fireAction();
 
  EasyMock.verify(getMockNavigationProcessor());
}

Back to the top