我有一个非常简单的问题:我一直在向具有 Context 对象的命令对象编写一些单元测试。该上下文内部有一些域实体。
public class Context {
private DomainEntity domainEntity1;
private Dto dto1;
// getters and setters go here...
public boolean isDomainEntityValid() {
// a little bit of logic goes here
}
}
public class Command {
public void execute(Context context) {
// do its logic in here
}
}
DTO 和 DomainEntity 只有 setter 和 getter 以及非常简单的验证方法(例如 isFirstNameValid()
)。
Context 对象确实有逻辑 - 毕竟,它检查上下文是否一致,上下文是否完整,等等。
当对命令对象进行单元测试时,我很清楚应该模拟上下文 - 但是实体和 dto 呢?我应该 mock 他们吗?如果是这样,我将不得不执行大量如下代码
doReturn(1L).when(domainEntity1).getId();
doReturn("phil").when(domainEntity1).getName();
换句话说,必须定义 getter 方法的许多行为。
所以,底线是:在对对象进行单元测试时我应该模拟域实体和 DTO 吗?
最佳答案
我认为您可能违反了 "Law" of Demeter这里。我把它放在引号中是因为你不应该将其作为法律来遵循,而应该作为建议来遵循。
您并没有真正为我们提供足够的上下文来告诉您应该具体更改什么(即:为什么命令需要 id 和名称?),但是还有另一个原则称为 Tell, Don't Ask我认为如果您更改代码以遵循这一点,您的代码将变得更容易测试。
关于java - 单元测试中的模拟域实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14390512/