代码之家  ›  专栏  ›  技术社区  ›  JeanValjean

在不调用mock的情况下将类设置为Mockito mock

  •  1
  • JeanValjean  · 技术社区  · 11 年前

    我有一个基于Spring的Java应用程序,它使用服务。对于 some reasons ,我需要自动连接仅为单元测试而实现的服务。我希望这个自动连线的类是一个Mockito mock,这样我就可以将它传递给所有Mockito方法( when() 等等)。我应该扩展或实现一些Mockito类吗?

    例如。

    @Profile("test")
    @Primary
    @Service
    public class MockAService implements AService {
        public void callMethod(){}
    }
    

    然后在测试中我有

    {
        System.setProperty("spring.profiles.active", "test");
    }
    
    @Autowired AService aservice;
    

    在我想做的测试方法中:

    @Test
    public void test(){
      doNothing().when(aService).callMethod();
    }
    
    2 回复  |  直到 9 年前
        1
  •  2
  •   JEY    11 年前

    只需使用 @Spy 在您的@Before方法中调用MockitoAnnotations.initMocks。它将为您注入的服务创建间谍。

    例如,我想测试MyService,它依赖于MyDao。我希望我的服务使用我的嘲讽刀。

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {"classpath:/com/stackoverflow/mokito/exemple/spring.xml"})
    public class TestCase {
        @Resource
        @InjectMocks
        private MyService service;
    
        @Resource
        @Spy
        private MyDao dao;
    
        public void setup() {
            MockitoAnnotations.initMocks(this);
        }
    }
    

    然而,您的春季环境现在是“肮脏的”。下一个测试类将使用相同的spring上下文,MyService仍将使用mock。所以不要忘记在@After中重置mock

        2
  •  0
  •   oailloud    11 年前

    如果你不想让服务做任何事情,模拟甚至会比间谍更好。默认情况下,在mock上调用函数不会做任何事情。 对于间谍,您必须显式调用doNothing()。

    但为什么无论如何都要加载任何Spring上下文?你不能模拟所有的服务并完全隔离地测试你的类吗?