我有一个超类
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
将成为一种负担。
我意识到这并不能直接回答你的问题,但希望你能修改你的设计,让测试更容易。