Mockito:构造函数(Java)中的间谍调用



这不是带有 Mockito 的 new() 调用的 Test 类的副本。我正在尝试编写一个测试来验证在我的间谍对象(mockToyFacade)的构造函数中是否调用了某些方法。

测试的类是ToyFactoryFacade。 这个想法是客户端与ToyFactoryFacade(包装ToyFactory)交互以生成ToyFacades,ToyFacades本身就是Toy 对象的包装器。

我想向Mockito验证什么?

我想验证addToyName(toyName) 和addCreationTime(creationTimestamp)是否在 ToyFacade 上被调用。 这两种方法都在 ToyFacade 的构造函数中调用。

问题出在哪里?

当我尝试监视 ToyFacade 并验证是否调用了上述两种方法时,我收到一个错误,指出"实际上,与此模拟的交互为零"。当我单独调用方法(即,不通过构造函数)时,验证会正确检查。我不确定我做错了什么。

测试代码

public class ToyFactoryFacadeTest {
private Toy mockToy;
private ToyFacade mockToyFacade;
// System under test.
private ToyFactoryFacade toyFactoryFacade;
private ToyFactory mockToyFactory;
@Before
public void setup() {
mockToy = mock(Toy.class);
mockToyFacade = spy(new ToyFacade(mockToy, "Phone", System.currentTimeMillis()));
mockToyFactory = mock(ToyFactory.class);
toyFactoryFacade  = new ToyFactoryFacade(mockToyFactory) {
@Override
public Toy getToyFacade(String toyName, long creationTimestamp){
return mockToyFacade;
}
};  
}
@Test
public void testToyFactoryFacade() {
toyFactoryFacade.initializeAndGetToy("Phone", System.currentTimeMillis());
verify(mockToyFacade).addToyName("Phone");
verify(mockToyFacade).addCreationTime(anyLong());
}
}

源代码

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);

其中timestamp是您在setUp方法中传入的任何内容。

最新更新