【问题标题】:why is mockito not called when executing mocked method?为什么在执行模拟方法时不调用模拟?
【发布时间】:2014-08-23 09:14:48
【问题描述】:

这是我的测试:

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

【问题讨论】:

  • 发布一个完整的测试用例重现问题。
  • 谢谢。请看我的更新

标签: java unit-testing junit mocking mockito


【解决方案1】:

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

aMethodWithInnerCallToRepositoryGetVenue();

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

【讨论】:

    【解决方案2】:

    正如用户 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));
        }
    }
    

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

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2019-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      • 2022-11-03
      • 1970-01-01
      相关资源
      最近更新 更多