0

我目前正在使用的遗留 Java 代码库使用了一个臭名昭著的框架。它在包装精美的 jar 中为我提供了开箱即用的域类。域类不过是一袋袋的 getter 和 setter。

这阻止了我通过从静态 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);
4

1 回答 1

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(user)
3) 如果需要,在 AClassIDontKnowUnitTest 中使用模拟 DomainModelMapper。

于 2013-10-25T13:09:40.237 回答