在不调用mock的情况下,让一个类成为Mockito模拟

时间:2015-08-31 14:13:36

标签: java spring unit-testing mockito

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

E.g。

@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 个答案:

答案 0 :(得分:2)

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

例如,我想测试MyService,它对MyDao有依赖性。我希望MyService使用我的模拟dao。

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

然而,你的春天环境现在已经很糟糕了#34;下一个测试类将使用相同的spring上下文,MyService仍将使用mock。所以不要忘记在@After重置模拟

答案 1 :(得分:0)

如果你不希望服务做任何事情,模拟甚至会比间谍更好。默认情况下,在模拟上调用函数将不会执行任何操作。 使用间谍,您必须显式调用doNothing()。

但是为什么要加载任何Spring上下文呢?难道你不能完全隔离所有服务并测试你的课程吗?