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
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. –
'@ Mocked' sollte alle Instanzen des FacesContext vortäuschen, also nicht ganz sicher, was du meinst? – PDStat
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. –