繁体   English   中英

为什么在执行模拟方法时未调用模拟通知?

[英]why is mockito not called when executing mocked method?

这是我的测试:

    @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(因为没有场地的会场ID =“ 1.2.3”

这就是为什么我首先使用模拟游戏的原因。

public void aMethodWithInnerCallToRepositoryGetVenue(){
...
        IVenue v = repository.getVenue(r.venueId);
..
}

您在方法中模拟了存储库,但是此模拟存储库仅分配给了局部变量。 因此,调用repository.getVenue()的代码在另一个存储库实例上而不是在由Mockito创建的实例上调用它:

aMethodWithInnerCallToRepositoryGetVenue();

此方法无法知道在方法调用之前已初始化的局部变量。

正如用户JB Nizet所写的那样,您正在使用两个不同的存储库实例。 您可以执行以下操作:首先,您要模拟一个存储库类,使其成为下一个类中的协作者。

public class VenuesRepository {

    public IVenue getVenue(String id) {
        return new IVenue() {
            // do something
        };
    }
}

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

现在,已被模拟的存储库实例是相同的。

希望对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM