我目前正在使用的遗留Java代码库使用了一个臭名昭着的框架。它在包装精美的罐子里为我提供了开箱即用的域类。域类只不过是吸气剂和吸尘剂袋。
这使我无法通过将静态Util类中的过程代码提取到合法的位置(即域类本身)来繁殖富域模型。例如,考虑以下方法中的逻辑:
public static boolean areFriends(User user1, User user2) {
for (User friend : user1.getFriends()) {
if (friend.equals(user2)) {
return true;
}
}
return false;
}
这可以在isFriendOf(User another)
类中很好地表达为User
。但是,User
类全部被锁定。顺便说一句,框架使用生命周期方法传递User
对象:
//Life-cycle method
public void execute(FrameworkBlob frameworFattyObject) {
...
User user = frameworFattyObject.getUser();
User loggedInUser = getLoggedInUserFromSomewhere();
bool areFriends = BadUtilClass.areFriends(user, loggedInUser);
...
}
记住可测试性,有没有办法可以说:
bool areFriends = user.isFriendOf(loggedInUser);
答案 0 :(得分:1)
不熟悉臭名昭着的框架。我应该先评论,但这太长了。
是否有可能在生命周期方法中注入一些东西?
例如:
public class AClassIDontKnow {
private DomainModelMapper mapper;//inject this
//Life-cycle method
public void execute(FrameworkBlob frameworFattyObject) {
...
UserDomainModel user = mapper.getUser(frameworFattyObject);
UserDomainModel loggedInUser = getLoggedInUserFromSomewhere();
bool areFriends = user.isFriendOf(loggedInUser);
...
}
}
public class DomainModelMapper {
UserDomainModel getUser(FrameworkBlob frameworFattyObject) {
User userAnemicModel = frameworFattyObject.getUser();
//map the anemicModel to a rich domain model
return ....;
}
}
因此测试策略:
1)放置DomainModelMapperUnitTest来测试映射
2)UserDomainModelUnitTest涵盖isFriend(用户)
3)如果需要,在AClassIDontKnowUnitTest中使用mock for DomainModelMapper。