public void TestMethodFiltering_SPR6764() { var parser = new SpelExpressionParser(); var context = new StandardEvaluationContext(); context.SetRootObject(new TestObject()); var filter = new LocalFilter(); context.RegisterMethodFilter(typeof(TestObject), filter); // Filter will be called but not do anything, so first doit() will be invoked var expr = (SpelExpression)parser.ParseExpression("DoIt(1)"); var result = expr.GetValue <string>(context); Assert.Equal("1", result); Assert.True(filter.FilterCalled); // Filter will now remove non @Anno annotated methods filter.RemoveIfNotAnnotated = true; filter.FilterCalled = false; expr = (SpelExpression)parser.ParseExpression("DoIt(1)"); result = expr.GetValue <string>(context); Assert.Equal("double 1.0", result); Assert.True(filter.FilterCalled); // check not called for other types filter.FilterCalled = false; context.SetRootObject("abc".Clone()); expr = (SpelExpression)parser.ParseExpression("[0]"); result = expr.GetValue <string>(context); Assert.Equal("a", result); Assert.False(filter.FilterCalled); // check de-registration works filter.FilterCalled = false; context.RegisterMethodFilter(typeof(TestObject), null); // clear filter context.SetRootObject(new TestObject()); expr = (SpelExpression)parser.ParseExpression("DoIt(1)"); result = expr.GetValue <string>(context); Assert.Equal("1", result); Assert.False(filter.FilterCalled); }