如何在子类测试中模拟超级方法



我有一个超类

public class superAuthClass {
public boolean authorize(String id) {
//does some check, returns a boolean
}
}

我有一个扩展superAuthClass 的子类

public class subAuthClass extends superAuthClass {
public boolean authorize (String id1) {

if (super.authorize(id1)) {
return true;
}
//does some logic to figure out the fallback id2
else {
if (super.authorize(id2))
return true;
}
return false;
}

在测试子类实现时,我如何模拟super.authorize?

如果可以,可以考虑使用组合而不是继承。您可以有一个由SuperAuthClass实现的Authorizer接口,以及一个由另一个Authorizer:组成的DelegatingAuthorizer接口,而不是从SuperAuthClass继承

interface Authorizer {
boolean authorize(String id);
}
class SuperAuthClass implements Authorizer {
...
}
class DelegatingAuthorizer implements Authorizer {
private Authorizer delegate;
public boolean authorize(String id) {
if (delegate.authorize(id)) {
return true;
}
String id2 = ...;
return delegate.authorize(id2);
}
}

客户端代码将被重构以理解Authorizer,而不了解SuperAuthClass

这种方法使测试变得更容易:在测试Authorizer的客户端时,模拟接口非常容易,并且使测试DelegatingAuthorizer变得简单。

这种设计也意味着您的DelegatingAuthorizer不仅仅与SuperAuthClass绑定,它可以与任何Authorizer一起使用。随着时间的推移,这将使您的代码更易于维护。有了继承,总有一天你会发现你需要另一种类型的SuperAuthClass——例如,也许你想支持LDAP——然后你的SubAuthClass将成为一种负担。

我意识到这并不能直接回答你的问题,但希望你能修改你的设计,让测试更容易。

最新更新