我有一个课程如下:
@Component
public class UserAuthentication {
@Autowired
private AuthenticationWebService authenticationWebservice;
public boolean authenticate(username, password) {
result = authenticationWebService.authenticateUser(username, password)
//do
//some
//logical
//things
//here
return result;
}
}
我正在编写单元测试以查看函数是否正常运行。现在我不打算做一个真正的网络服务电话。那么我怎样才能以这样的方式模拟web服务:当我调用我的类的authenticate方法时,使用模拟的webservice对象而不是真正的对象。
答案 0 :(得分:1)
您应该在测试类中使用@ContextConfiguration
注释。
这样做Spring将从classpath:/foo.bar/spring/test/...xml
在context.xml
的{{1}}文件中,您可以创建模拟对象,Spring将注入它们而不是真实的。
如果您需要分步指南,只需搜索/test/
(我不包含链接,因为它们可能会及时更改),您可以找到许多教程。
答案 1 :(得分:1)
使用Mockito你可以像这样存根外部服务:
'when(mockedAuthenticationWebService.authenticate(username, password).thenReturn(yourStubbedReturnValue);'
我是从记忆中写出来的,如果它不能立即编译,请原谅;你会明白的。
在这里,使用Mockito,hamcrest和JUnit 4,我也验证使用正确的参数调用服务,您的测试也需要覆盖:)
@Test
public class UserAuthenticationTest {
// Given
UserAuthentication userAuthentication = new UserAuthentication();
AuthenticationWebService mockedAuthenticationWebService = mock(AuthenticationWebService.class)
String username = "aUsername" , password = "aPassword";
when(mockedAuthenticationWebService.authenticate(username, password).thenReturn(true); // but you could return false here too if your test needed it
userAuthentication.set(mockedAuthenticationWebService);
// When
boolean yourStubbedReturnValue = userAuthentication.authenticate(username, password);
//Then
verify(mockedAuthenticationWebService).authenticateUser(username, password);
assertThat(yourStubbedReturnValue, is(true));
}
最后,你的班级是@Autowired这一事实对这一点没有任何影响。