我目前正在使用的遗留 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;
}
这可以在 User
类中很好地表达为 isFriendOf(User another)
。然而,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);
最佳答案
不熟悉臭名昭著的框架。我应该先发表评论,但太长了。
是否可以向生命周期方法注入(inject)一些东西?
例如:
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的模拟。
关于java - 打包域类上下文中的丰富域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19590206/