diff --git a/src/test/java/org/yaml/snakeyaml/representer/FilterPropertyToDumpTest.java b/src/test/java/org/yaml/snakeyaml/representer/FilterPropertyToDumpTest.java
index df3e4d4..d11e31a 100644
--- a/src/test/java/org/yaml/snakeyaml/representer/FilterPropertyToDumpTest.java
+++ b/src/test/java/org/yaml/snakeyaml/representer/FilterPropertyToDumpTest.java
@@ -18,6 +18,7 @@
 
 import java.beans.IntrospectionException;
 import java.util.Set;
+import java.util.TreeSet;
 
 import junit.framework.TestCase;
 
@@ -28,9 +29,10 @@
 
 public class FilterPropertyToDumpTest extends TestCase {
 
-    public void testFilterProperty() {
+    public void testFilterPropertyInJavaBeanDumper() {
         BeanToRemoveProperty bean = new BeanToRemoveProperty();
         bean.setNumber(24);
+        bean.setId("ID124");
         JavaBeanDumper d = new JavaBeanDumper(new MyRepresenter(), new DumperOptions());
         String dump = d.dump(bean);
         // System.out.println(dump);
@@ -39,30 +41,37 @@
                 dump);
     }
 
-    public void testFilterProperty2() {
+    public void testFilterPropertyInYaml() {
         BeanToRemoveProperty bean = new BeanToRemoveProperty();
-        bean.setNumber(24);
+        bean.setNumber(25);
+        bean.setId("ID125");
         Yaml yaml = new Yaml(new MyRepresenter());
         String dump = yaml.dump(bean);
         // System.out.println(dump);
         assertEquals(
-                "!!org.yaml.snakeyaml.representer.FilterPropertyToDumpTest$BeanToRemoveProperty {number: 24}\n",
+                "!!org.yaml.snakeyaml.representer.FilterPropertyToDumpTest$BeanToRemoveProperty {number: 25}\n",
                 dump);
-        // include by default
+    }
+
+    public void testDoNotFilterPropertyIncludeReadOnly() {
+        BeanToRemoveProperty bean = new BeanToRemoveProperty();
+        bean.setNumber(26);
+        bean.setId("ID126");
         DumperOptions options = new DumperOptions();
         options.setAllowReadOnlyProperties(true);
-        yaml = new Yaml(options);
-        dump = yaml.dump(bean);
+        Yaml yaml = new Yaml(options);
+        String dump = yaml.dump(bean);
         // System.out.println(dump);
         assertEquals(
-                "!!org.yaml.snakeyaml.representer.FilterPropertyToDumpTest$BeanToRemoveProperty {number: 24,\n  setTestCase: true}\n",
+                "!!org.yaml.snakeyaml.representer.FilterPropertyToDumpTest$BeanToRemoveProperty {id: ID126,\n  number: 26, something: true}\n",
                 dump);
     }
 
     public class BeanToRemoveProperty {
         private int number;
+        private String id;
 
-        public boolean isSetTestCase() {
+        public boolean isSomething() {
             return true;
         }
 
@@ -73,6 +82,14 @@
         public void setNumber(int number) {
             this.number = number;
         }
+
+        public void setId(String id) {
+            this.id = id;
+        }
+
+        public String getId() {
+            return id;
+        }
     }
 
     private class MyRepresenter extends Representer {
@@ -80,16 +97,17 @@
         protected Set<Property> getProperties(Class<? extends Object> type)
                 throws IntrospectionException {
             Set<Property> set = super.getProperties(type);
+            Set<Property> filtered = new TreeSet<Property>();
             if (type.equals(BeanToRemoveProperty.class)) {
-                // drop setTestCase property
+                // filter properties
                 for (Property prop : set) {
-                    if (prop.getName().equals("setTestCase")) {
-                        set.remove(prop);
-                        break;
+                    String name = prop.getName();
+                    if (!name.equals("id")) {
+                        filtered.add(prop);
                     }
                 }
             }
-            return set;
+            return filtered;
         }
     }
 }
