簡體   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