0

我有一个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
    }
}

现在对于单元测试,我需要验证方法来假装它正常工作,在我的情况下什么都不做,所以我可以测试方法本身是否完成了预期的工作(根据单元测试原则在其他地方测试了身份验证,但是身份验证需要在该方法中被调用)所以我在想,我需要SomeService使用一个模拟,当被调用AuthenticationManager时,它只会返回并且什么都不做。authenticate()someMethod()

我如何使用 PowerMock(或 EasyMock / Mockito,它们是 PowerMock 的一部分)来做到这一点?

4

1 回答 1

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())
    }
}

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

希望有帮助。

于 2012-02-14T15:03:57.007 回答