我有一个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的一部分)?
答案 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关键字,这是一种在练习测试驱动开发时工作/设计测试和代码的简洁方法。
希望有所帮助。