2016-06-27 12 views
0

Zuvor habe ich @Mocked auf einem ResourceBundle z.JMockit Erstellen eines gefälschten FacesContext ResourceBundle

@Test 
public void testMyMethod(@Mocked final ResourceBundle resourceBundle) { 
    new Expectations() { 
     { 
      resourceBundle.getString("someString"); 
      result = "myResult"; 
     } 
    } 
} 

Dies hat bis eine bestimmte Methode gut funktioniert Ich bin Tests hat die folgende Codezeile

DateFormat format = new SimpleDateFormat("yyyy-MM-dd"); 

Wenn ich meinen Test ein Mock ResourceBundle mit der Methode erstellt oben dann ein NumberFormatException werfen würde auf Diese Linie, Grund ist der SimpleDateFormat Konstruktor arbeitet mit einer ResourceBundle während der Erstellung einer Calendar Instanz für seine Standardeinstellung Locale.

Also was ich tun möchte, ist eine Fälschung zu erstellen, die mein verspottetes Ergebnis für einige Anrufe an getString und den Standard für andere zB zurückgeben wird.

new Mockup<ResourceBundle>() { 
    @Mock 
    public String getString(Invocation inv, String key) { 
     if ("someString".equals(key)) { 
      return "myResult"; 
     } else if ("someOtherString".equals(key)) { 
      return "myOtherResult"; 
     } else { 
      return inv.proceed(); 
     } 
    } 
}; 

Ich möchte diese gefälschte ResourceBundle verwenden, wenn es über eine FacesContext zB abgerufen wird.

FacesContext facesContext = FacesContext.getCurrentInstance(); 
ResourceBundle bundle = facesContext.getApplication().getResourceBundle(facesContext, "myBundle"); 

Als mein Test in einem Laufbehälter ist nicht bei mir läuft das FacesContext spöttisch und ich möchte die Fälschung verwenden, die ich angelegt habe, so habe ich so etwas wie dieses

@Test 
public void testMyMethod(@Mocked final FacesContext facesContext) { 
    final ResourceBundle resourceBundle = new Mockup<ResourceBundle>() { 
     @Mock 
     public String getString(Invocation inv, String key) { 
      if ("someString".equals(key)) { 
       return "myResult"; 
      } else if ("someOtherString".equals(key)) { 
       return "myOtherResult"; 
      } else { 
       return inv.proceed(); 
      } 
     } 
    }.getMockInstance(); 

    new Expectations() { 
    { 
     facesContext.getApplication().getResourceBundle(facesContext, "myBundle"); 
     result = resourceBundle; 
    } 

    unitUnderTest.methodUnderTest(); 
} 

Allerdings sieht es aus wie es die Standard ResourceBundle getString() für alle Fälle ist und nicht über meine gefälschte

+0

Sind Sie sicher, dass mocked resourceBundle in Ihrem ApplicationContext- oder CDI-Kontext verwendet wird? Sie müssen den Kontext einfügen, um die Standardimplementierung zu ersetzen. –

+0

'@ Mocked' sollte alle Instanzen des FacesContext vortäuschen, also nicht ganz sicher, was du meinst? – PDStat

+0

Machen Sie einen Check-in-Test, wenn Sie sagten, dass getString() die Standardimplementierung aufruft, liegt das daran, dass die Standardimplementierung im Kontext verwendet wird, selbst wenn es sich um die mockige Implementierung handelt. –

Antwort

0

OK mit so habe ich es geschafft, eine Lösung zu finden, das tut, was ich will, war der Schlüssel zu bekommen, diese Arbeit Deencapsulation.invoke auf diezu verwenden 10

@Test 
public void testMyMethod() { 
    final FacesContext facesContext = new Mockup<FacesContext>() { 
     @Mock 
     public Application getApplication() { 
      return new MockUp<Application>() { 
       @Mock 
       public ResourceBundle getResourceBundle(FacesContext ctx, String name) { 
        return new MockUp<ResourceBundle>() { 
         @Mock 
         public String getString(Invocation inv, String key) { 
          if ("someString".equals(key)) { 
           return "myResult"; 
          } else if ("someOtherString".equals(key)) { 
           return "myOtherResult"; 
          } else { 
           return inv.proceed(); 
          } 
         }  
        }.getMockInstance(); 
       } 
      }.getMockInstance(); 
     } 
    }.getMockInstance(); 

    Deencapsulation.invoke(FacesContext.class, "setCurrentInstance", facesContext); 

    unitUnderTest.methodUnderTest(); 
} 
Verwandte Themen