Hi
Damit in meiner Rest api die timezone konfigurierbar ist, habe ich eine Filter erstellt, der den timezone paramerter entgegen nimmt und diesen dem context übergibt.
Dafür würde ich gerne einen Unit test schreiben. Jedoch setze ich den Context im finally block wieder zurück, was dazu führt, dass ich den Inhalt des contextes nach aufruf der
Kann ich hier irgendwas sinnvolles tun um einen Unit Test zu schreiben?
Damit in meiner Rest api die timezone konfigurierbar ist, habe ich eine Filter erstellt, der den timezone paramerter entgegen nimmt und diesen dem context übergibt.
Dafür würde ich gerne einen Unit test schreiben. Jedoch setze ich den Context im finally block wieder zurück, was dazu führt, dass ich den Inhalt des contextes nach aufruf der
doFilter()
nicht mehr überprüfen kann. Die Methode im TimezoneContext kann ich auch nicht spyen, da diese statisch ist. Kann ich hier irgendwas sinnvolles tun um einen Unit Test zu schreiben?
Java:
@Component
public class TimeZoneFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String timeZoneParam = httpRequest.getParameter("timezone");
TimeZoneContext.setTimeZone(ZoneId.of(Objects.requireNonNullElse(timeZoneParam, "UTC")));
try {
chain.doFilter(request, response);
} finally {
TimeZoneContext.clear();
}
}
}
Code:
public class TimeZoneContext {
private static final ThreadLocal<ZoneId> timeZoneHolder = new ThreadLocal<>();
public static void setTimeZone(ZoneId zoneId) {
timeZoneHolder.set(zoneId);
}
public static ZoneId getTimeZone() {
return timeZoneHolder.get() != null ? timeZoneHolder.get() : ZoneId.of("UTC");
}
public static void clear() {
timeZoneHolder.remove();
}
}
Java:
class TimeZoneContextTest {
@AfterEach
void tearDown() {
TimeZoneContext.clear();
}
@Test
void should_return_default_timezone_utc() {
ZoneId result = TimeZoneContext.getTimeZone();
assertEquals(ZoneId.of("UTC"), result);
}
@Test
void should_set_timezone() {
TimeZoneContext.setTimeZone(ZoneId.of("Europe/Berlin"));
ZoneId timeZone = TimeZoneContext.getTimeZone();
assertEquals(ZoneId.of("Europe/Berlin"), timeZone); //TimeZoneContext.clear() wurde im finally block aufgerufen -> context ist leer und returnt "UTC"
}
}