这是我的测试:
@Test
public void myTest() throws Exception {
String aVenueId = "1.2.3";
Venue2 aVenue = new Venue2(aVenueId);
VenuesRepository repository = mock(VenuesRepository.class);
when(repository.getVenue(anyString())).thenReturn(new VenueThumb(aVenue));
aMethodWithInnerCallToRepositoryGetVenue();
...
}
然而,当测试运行我的真实代码时,
此行返回null(因为没有具有venueId =“1.2.3”的场地
这就是为什么我首先使用我的模拟器。)
public void aMethodWithInnerCallToRepositoryGetVenue(){
...
IVenue v = repository.getVenue(r.venueId);
..
}
答案 0 :(得分:1)
您在方法中模拟了存储库,但此模拟存储库仅分配给局部变量。所以调用repository.getVenue()
的代码在不同的存储库实例上调用它,而不是在Mockito创建的实例上调用它:
aMethodWithInnerCallToRepositoryGetVenue();
这个方法无法知道在方法调用之前初始化的局部变量。
答案 1 :(得分:0)
正如用户JB Nizet编写的那样,您正在使用两个不同的存储库实例。您可以执行以下操作:首先,您要在下一个类中模拟成为协作者的存储库类。
public class VenuesRepository {
public IVenue getVenue(String id) {
return new IVenue() {
// do something
};
}
}
Class Foo使用VenuesRepository的实例作为协作者,这不是单元测试的目标,所以你应该在需要时模拟它的行为。
public class Foo {
private VenuesRepository repository;
public Foo(VenuesRepository repo) {
repository = repo;
}
public IVenue getVenueFromRepository(String id) {
return repository.getVenue(id);
}
}
现在测试
public class FooTest {
@Test
public void testGetRepositoryWithMock() throws Exception {
String aVenueId = "1.2.3";
VenuesRepository repository = mock(VenuesRepository.class);
when(repository.getVenue(anyString())).thenReturn(mock(IVenue.class));
Foo foo = new Foo(repository);
assertNotNull(foo.getVenueFromRepository(aVenueId));
}
}
现在已经模拟的存储库实例是相同的。
我希望它有所帮助。