@Test
    public void testVerifyProxyDocumentOverridesEverything() {
        List<Method> allPublicFromProxyDocument = new ArrayList<>();
        for (Method m : ProxyDocument.class.getDeclaredMethods()) {
            if (Modifier.isPublic(m.getModifiers())) {
                allPublicFromProxyDocument.add(m);
            }
        }
        List<Method> allPublicFromDoc = new ArrayList<>();
        for (Method m : Document.class.getDeclaredMethods()) {
            if (mustBeOverriddenInProxyDocument(m)) {
                allPublicFromDoc.add(m);
            }
        }
        for (Method m : StructuredFieldValue.class.getDeclaredMethods()) {
            if (mustBeOverriddenInProxyDocument(m)) {
                allPublicFromDoc.add(m);
            }
        }

        for (Method m : allPublicFromDoc) {
            boolean thisOneOk=false;
            for (Method pdM : allPublicFromProxyDocument) {
                if (sameNameAndParams(m, pdM)) thisOneOk=true;
            }
            if (!thisOneOk) {
                throw new RuntimeException("ProxyDocument must override all public methods from Document. " +
                        "Missing: '"+m+"'. If the method doesn't need field mapping or @Accesses check, just " +
                "override it and delegate the call to 'doc'.");

            }
        }
    }
To make it less likely to break schema mapping, we enforce that ProxyDocument does wrap every public
non-static, non-final method on Document and StructuredFieldValue
docproc/src/test/java/com/yahoo/docproc/proxy/SchemaMappingAndAccessesTest.java