2016-05-10 6 views
0

Ich teste eine Methode mit JUnit API und ich möchte den Wert einer lokalen Variablen testen, damit ich eine bessere Zweigabdeckung erhalten. In der zu testenden Methode widgets ist eine Variable vom Typ List und während der Fehlersuche fand ich heraus, dass es nicht null ist. Ich möchte es für Null testen, aber ich bin nicht sicher, wie man seinen Wert ändert?So testen Sie eine lokale Variable in JUnit zur Verbesserung der Codeabdeckung

Methode im Test:

public boolean preProcess(ServiceContext ctx) throws ProcessorException { 
    logMethodStartDebug(ctx, CLASS_NAME, "preProcess(ServiceContext, Object)"); 

    try { 

     if(Constants.YES.equalsIgnoreCase(EISSpringUtil.getMessage(ENABLE_SELF_HEALING_FLAG))) {   
      if(AppContext.getApplicationContext().containsBean(ISO + AGGREGATOR_HEALTH_PREFIX)) { 
       IMonitoringWidgetAggregator aggregator = (IMonitoringWidgetAggregator)AppContext.getBean(ISO + AGGREGATOR_HEALTH_PREFIX); 
       List<MonitoringWidget> widgets = aggregator.aggregate(); 

       if(widgets != null && widgets.size() > 0) {    
        for(MonitoringWidget mw : widgets) { 
         if(mw.getStatus().equals(MonitoringStatus.FAIL)) { 
          ctx.addMessage(ErrorMessageUtil.generateMessage(getMessageFactory(), ErrorCodeConstants.STATUS_6000, new Object[] { ctx.getSystemName(), mw.getMonitoringCode()})); 
          return false; 
         } 
        } 
       } 
      } 
     } 

     return true; 
    } finally { 
     logMethodEndDebug(ctx, CLASS_NAME, "preProcess(ServiceContext, Object)"); 
    } 
} 

JUnit-Testfall für positives Szenario

@Test 
public void testPreProcess() throws Exception { 
    AppContext.setApplicationContext(applicationContext); 
    ServiceContext ctx = new ServiceContext(); 

    boolean b = preProcess(ctx); 
    assertFalse(b); 
    assertNotNull(ctx); 
    assertNotNull(ctx.getMessages()); 
    assertNotNull(ctx.getMessages().get(0)); 
    assertEquals("code:6000", ctx.getMessages().get(0) .getMessageCode()); 
} 

Vielen Dank im Voraus

+1

Ich sehe "Pfeilcode" hier. Behebt das zuerst - es ist zu früh, um sich Sorgen um die kleinen Implementierungsdetails zu machen, dass "Widgets" null sein könnten. Siehe http://blog.codinghorror.com/flattening-arrow-code/ – unigeek

+0

Mögliches Duplikat von [Wie testet man eine Klasse mit privaten Methoden, Feldern oder inneren Klassen?] (Http://stackoverflow.com/questions/34571/how-to-Test-eine-Klasse-das-hat-private-Methoden-Felder-oder-innere-Klassen) – Raedwald

Antwort

0

Sie müssen in Ihrem AppContext für die Unit-Tests, Ihr Test Bean definieren :

IMonitoringWidgetAggregator aggregator = (IMonitoringWidgetAggregator)AppContext.getBean(ISO + AGGREGATOR_HEALTH_PREFIX); 

Sie haben Zugriff auf den Aggregator. Wenn Sie beispielsweise ein CDI/IoC-kompatibles Framework wie Spring (oder einfach nur J2EE oder etwas wie KumulzuEE) verwenden, können Sie die @ContextConfiguration- und @Configuration-Annotationen verwenden Geben Sie an, woher Ihre @Beans injiziert werden sollen. Daher können Sie wählen, ob Sie einen IMonitoringWidgetAggregator-Mock oder eine reale Instanz einer Implementierung injizieren möchten, wenn Sie möchten, dass die gesamte Integration getestet wird.

+1

Got it. Vielen Dank. –

0

Eine einfache Möglichkeit zur Herstellung des Widget den Fokus der Unit-Tests Verarbeitung besteht darin, dass in einem separaten Verfahren Handhabung zu Refactoring:

public boolean preProcess(ServiceContext ctx) throws ProcessorException { 
    logMethodStartDebug(ctx, CLASS_NAME, "preProcess(ServiceContext, Object)"); 

    try { 
     if(Constants.YES.equalsIgnoreCase(EISSpringUtil.getMessage(ENABLE_SELF_HEALING_FLAG))) {   
      if(AppContext.getApplicationContext().containsBean(ISO + AGGREGATOR_HEALTH_PREFIX)) { 
       IMonitoringWidgetAggregator aggregator = (IMonitoringWidgetAggregator)AppContext.getBean(ISO + AGGREGATOR_HEALTH_PREFIX); 
       List<MonitoringWidget> widgets = aggregator.aggregate(); 
       return preProcessWidgets(widgets); 
      } 
     } 

     return true; 
    } finally { 
     logMethodEndDebug(ctx, CLASS_NAME, "preProcess(ServiceContext, Object)"); 
    } 
} 

private boolean preProcessWidgets(final List<MonitoringWidget> widgets) { 
    if(widgets != null && widgets.size() > 0) {    
     for(MonitoringWidget mw : widgets) { 
      if(mw.getStatus().equals(MonitoringStatus.FAIL)) { 
       ctx.addMessage(ErrorMessageUtil.generateMessage(getMessageFactory(), ErrorCodeConstants.STATUS_6000, new Object[] { ctx.getSystemName(), mw.getMonitoringCode()})); 
       return false; 
      } 
     } 
    } 
    return true; 
} 

Mit dieser Struktur

, können Sie jetzt einfach neue JUnit-Testfälle schreiben, die auf das Wesentliche konzentrieren Die Widget-Verarbeitung innerhalb der preProcessWidgets Methode durchgeführt, wie zum Beispiel: eine null List übergeben, eine leere List übergeben, und Sie können auch frei widgets Parameter in irgendeiner zusätzlichen Weise, die sinnvoll für Ihre Anwendung macht.