Mockito嘲笑 - 为什么我需要提供依赖?

时间:2017-08-22 14:05:29

标签: java spring unit-testing mockito

我想为Spring单元测试模拟一个服务,我想如果使用mockito来模拟一个依赖项,那么我就不必再模拟Mock所拥有的所有依赖项等等。

一个例子:

@ContextConfiguration(classes = ValidatorTestConfiguration.class)
public class ValidatorTest extends AbstractTestNGSpringContextTests
{
@Configuration
protected static class ValidatorTestConfiguration
{       
    @Bean
    public ITestValidator getTestValidator()
    {
        return new TestValidator();
    }


    @Bean
    public CheckSumValidator getCheckSumValidator()
    {
        return new CheckSumValidator();
    }


    @Bean
    public ITestService getTestService()
    {
        return Mockito.mock(TestService.class);
    }
}

@Autowired
private ITestService TestService;


@Autowired
private ITestValidator TestValidator;


@BeforeClass
public void setUp()
{
    //Here I want to use Mockito to override methods being called in the service
}


@Test
public void testHasValidFormat()
{
    final boolean hasValidIdFormat = this.testValidator.hasValidFormat("123456");
    assertEquals(true, hasValidIdFormat);
}
}

我认为通过模拟TestService,我不需要担心它需要的所有依赖项?

我遇到的问题是Spring抱怨注入验证器的服务所需的依赖性无法自动装配。

我通常只使用mockito注释来执行此操作,但我正在使用的第三方校验和类是最终的,因此Mockito无法模拟这个并且我想在调用服务方法调用的响应时调用此类中的实际方法。

1 个答案:

答案 0 :(得分:1)

如果您“编程到接口”并且使用了一个方便的界面,建议使用该接口而不是具体类创建模拟。这样,您就可以绕过实现中的任何逻辑。

@Bean
public ITestService getTestService()
{
    return Mockito.mock(ITestService.class);
}

当您为类创建Mockito模拟时,它会尝试在该类中执行构造函数/ init逻辑作为其模拟的一部分。因此,当您模拟具体类TestService时,您正在调用它的一些逻辑。由于它具有未被模拟的依赖项,因此您将获得异常。