使用Mockito / EasyMock模拟自动Web服务

时间:2013-05-24 12:26:50

标签: java unit-testing mocking

我有一个课程如下:

@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对象而不是真正的对象。

2 个答案:

答案 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这一事实对这一点没有任何影响。