karatelabs/karate · warning

removeMember() not implemented for

Error message

removeMember() not implemented for: {} - {}

What it means

The SimpleObject default removeMember() only logs this warning and does nothing. Deleting a member (delete obj.foo in JS) on an object that doesn't implement removeMember is silently ignored, so the property remains.

Solutions

  1. Copy the object into a plain Map and mutate that instead
  2. If you own the type, override removeMember(String) to perform the removal
  3. Verify the object type in the warning supports mutation at all

Example fix

// before
delete response.headers['X-Foo']; // no-op with warning
// after
var headers = karate.copy(response.headers);
delete headers['X-Foo'];
Defensive patterns

Strategy: type-guard

Type guard

// only delete on plain JS/Map objects
function safeDelete(obj, key) { var map = karate.copy(obj); delete map[key]; return map; }

Prevention

When it happens

Trigger: JS delete of a property, or Java-side call to removeMember(name), on a class implementing SimpleObject that relies on the default implementation.

Common situations: Trying to mutate immutable/read-only Java-backed objects from JS; expecting built-in objects (like HTTP responses) to support property deletion.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of karatelabs/karate@a22eb90246 (2026-09-12). Data as JSON: /api/errors/2e2f4e9deb1969cb. Report an issue: GitHub.

Appendix: source

Thrown at karate-js/src/main/java/io/karatelabs/js/SimpleObject.java:48

import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;

public interface SimpleObject extends ObjectLike {

    Logger logger = LoggerFactory.getLogger(SimpleObject.class);

    String TO_STRING = "toString";

    @Override
    default void putMember(String name, Object value) {
        logger.warn("putMember() not implemented for: {} - {}", name, getClass().getName());
    }

    @Override
    default void removeMember(String name) {
        logger.warn("removeMember() not implemented for: {} - {}", name, getClass().getName());
    }

    @Override
    default Map<String, Object> toMap() {
        return toMap(jsKeys(), this);
    }

    default Collection<String> jsKeys() {
        logger.warn("jsKeys() not implemented for: {}", getClass().getName());
        return Collections.emptyList();
    }

    @Override
    default Object getMember(String name) {
        if (TO_STRING.equals(name)) {
            return jsToString();
        }
        return jsGet(name);

View on GitHub (pinned to a22eb90246)