如何使用PowerMock / Mockito / EasyMock使用模拟对象进行依赖注入?

时间:2012-02-14 13:29:09

标签: unit-testing dependency-injection mockito easymock powermock

我有一个AuthenticationManager.authenticate(username,password)方法,可以在测试中的SomeService的someMethod中调用。 AuthenticationManager被注入SomeService:

@Component
public class SomeService {
    @Inject
    private AuthenticationManager authenticationManager;

    public void someMethod() {
        authenticationManager.authenticate(username, password);
        // do more stuff that I want to test
    }
}

现在对于单元测试我需要authenticate方法来假装它正常工作,在我的情况下什么也不做,所以我可以测试方法本身是否做了预期的工作(根据单元测试原则在其他地方测试身份验证,然而,需要在该方法中调用身份验证)所以我在思考,我需要SomeService使用一个只会返回的模拟AuthenticationManager,而authenticate()被{someMethod()调用时不会执行任何操作1}}。

如何使用PowerMock(或EasyMock / Mockito,它是PowerMock的一部分)?

1 个答案:

答案 0 :(得分:3)

使用Mockito你可以用这段代码(使用JUnit)来做到这一点:

@RunWith(MockitoJUnitRunner.class)
class SomeServiceTest {

    @Mock AuthenitcationManager authenticationManager;
    @InjectMocks SomeService testedService;

    @Test public void the_expected_behavior() {
        // given
        // nothing, mock is already injected and won't do anything anyway
        // or maybe set the username

        // when
        testService.someMethod

        // then
        verify(authenticationManager).authenticate(eq("user"), anyString())
    }
}

瞧。如果您想要具有特定行为,只需使用存根语法;请参阅文档there。 另请注意,我使用了BDD关键字,这是一种在练习测试驱动开发时工作/设计测试和代码的简洁方法。

希望有所帮助。