何时在java中使用@Override

Ric*_*ler 1 java unit-testing annotations

可能重复:
您何时使用Java的@Override注释?为什么?

从@Override注释的javadoc:

指示方法声明旨在覆盖超类中的方法声明.如果使用此批注类型注释方法但不覆盖超类方法,则编译器需要生成错误消息.

当我想测试一个类型的特定方法并替换我的测试主题调用的其他方法的行为时,我倾向于在测试中使用@Override注释.我的一位同事坚信,这不是一个有效的用途,但不确定原因.任何人都可以建议为什么要避免它?

我在下面添加了一个示例来说明我的用法.

对于测试对象Foo:

public class Foo {
    /**
     * params set elsewhere
     */
    private Map<String, String> params;

    public String doExecute(Map<String, String> params) {
        // TODO Auto-generated method stub
        return null;
    }

    public String execute() {
        return doExecute(params);
    }
}
Run Code Online (Sandbox Code Playgroud)

我会定义一个这样的测试:

public void testDoExecute() {
    final Map<String, String> expectedParams = new HashMap<String, String>();
    final String expectedResult= "expectedResult";
    Foo foo = new Foo() {
        @Override
        public String doExecute(Map<String, String> params) {
            assertEquals(expectedParams, params);
            return expectedResult;
        }
    };

    assertEquals(expectedResult, foo.execute());
}
Run Code Online (Sandbox Code Playgroud)

然后,如果我的doExecute()签名发生更改,我将在测试时遇到编译错误,而不是令人困惑的执行失败.

Mic*_*rdt 5

在这种测试中使用覆盖注释是完全有效的,但注释与测试没有特定的关系; 它也可以(并且应该)在整个生产代码中使用.