Mockito:在构造函数中监视调用(Java)
这不是的副本。我正在尝试编写一个测试,以验证在我的间谍对象(mockToyFacade)的构造函数中是否调用了某些方法。 被测试的类是ToyFactoryFacade。其思想是客户机与ToyFactoryFacade(包装ToyFactory)交互以生成ToyFacades,ToyFacades本身是玩具对象的包装器 我想用Mockito验证什么? 我想验证是否正在ToyFacade上调用addToyName(toyName)和addCreationTime(creationTimestamp)。这两种方法都在ToyFacade的构造函数中调用 有什么问题吗? 当我试图监视ToyFacade并验证是否调用了上述两个方法时,我收到一个错误,它说“实际上,与此模拟没有任何交互。”当我单独调用这些方法(即,不通过构造函数)时,验证正确我不确定我做错了什么。 测试代码 源代码Mockito:在构造函数中监视调用(Java),java,mockito,Java,Mockito,这不是的副本。我正在尝试编写一个测试,以验证在我的间谍对象(mockToyFacade)的构造函数中是否调用了某些方法。 被测试的类是ToyFactoryFacade。其思想是客户机与ToyFactoryFacade(包装ToyFactory)交互以生成ToyFacades,ToyFacades本身是玩具对象的包装器 我想用Mockito验证什么? 我想验证是否正在ToyFacade上调用addToyName(toyName)和addCreationTime(creationTimestamp)
您的测试没有达到预期效果,因为您试图验证的方法调用在创建spy之前已经发生。您真正想要做的是测试这两个方法调用的效果,而不是调用本身。这看起来像
verify(mockToy).addToyName("Phone");
verify(mockToy).addCreationTime(timestamp);
其中,
时间戳
是您在设置
方法中传递的任何内容。谢谢Dawood。正如您所指出的,我确实看到了测试这些调用对支持玩具对象(mockToy)的影响的工作与预期的一样。出于好奇,除了对被观察的mockToy对象的预期效果之外,还有什么方法可以验证对mockToyFacade的那些调用发生了吗?我不知道。如果有,你不应该用它。因为当您测试一个类时,您应该验证它对类之外发生的事情的影响。如果您发现自己正在测试类本身内部的机制,那么您就有了一种代码味道。这很有意义。谢谢这不是[class]的副本,其中有一个新的()调用,使用Mockito)这会在构造函数初始化时调用2个helper方法。我的问题是,为什么我无法验证这2个方法是否被调用。Dawood的观点是,我应该真正验证这两个调用对mockToy对象的影响,而不是验证调用是对ToyFacade spy(mockToyFacade)本身进行的。
public class ToyFactoryFacade {
private final ToyFactory toyFactory;
public ToyFactoryFacade(ToyFactory toyFactory) {
this.toyFactory = toyFactory;
}
public ToyFacade initializeAndGetToy(String toyName, long creationTimestamp)
{
getToyFacade(toyName, creationTimestamp);
}
// For testing.
protected ToyFacade getToyFacade(String toyName, long creationTimestamp
{
return new ToyFacade(toyFactory.newToy(), toyName, creationTimestamp);
}
}
public class ToyFactory {
public Toy newToy() {
return new Toy();
}
}
public class ToyFacade {
private final Toy toy;
public ToyFacade(Toy toy, String toyName, long creationTimeStamp) {
this.toy = toy;
addToyName(toyName);
addCreationTime(creationTimestamp);
}
public void addToyName(String name) {
toy.addToyName(toyName);
}
public void addCreationTime(long timestamp) {
toy.addCreationTime(timestamp);
}
}
public class Toy {
public String toyName;
public String creationTimestamp;
public void addToyName(String name) {
toyName = name;
}
public void addCreationTime(long timestamp) {
creationTimestamp = timestamp;
}
}
verify(mockToy).addToyName("Phone");
verify(mockToy).addCreationTime(timestamp);