如何在Java中为此服务编写测试用例?

时间:2014-11-20 04:47:03

标签: java unit-testing junit mocking jmockit

我有一个这个班级

public class AuthenticationModule {

    String userName = "foo";
    String password = "bar";

    public void setUserName(String userName) {
         this.userName = userName;
    }

    public void setPassword(String password ) {
         this.password = password ;
    }

    AuthenticationServicePort authenticationServicePort;
    AuthenticationService port;

    private boolean authenicate(String userName, String password) {

        authenticationServicePort = new AuthenticationServicePort();
        port = authenticationServicePort.getAuthenticationServiceProxy();
        return port.login(userName, password);
    }

    public boolean validateUser() {

        return authenicate(userName, password);
    }
}

AuthenticationServicePort返回一个WSDL端口 我想用模拟AuthenticationServicePort创建一个简单的测试用例,它会返回一个' true / false'价值

如何在不更改java代码的情况下注入我自己的MockObject? 或者更糟糕的情况是,更容易测试的最简单方法是什么。

2 个答案:

答案 0 :(得分:1)

您应该避免创建具有任何逻辑的类的实例(不是普通的DTO对象)。相反,您应该以这样的方式设计您的类,即依赖注入容器可以构建完整的对象图。如果authenicate方法的每次调用都需要AuthenticationServicePort的新实例,那么在您的代码中,您需要自己回答?如果是,则应使用factory模式创建此对象的实例,并且应注入此工厂(在构造函数中提供),以便您可以模拟它以及它将生成的所有内容。如果authenticate方法的多次调用可以重用AuthenticationServicePort的同一个实例,那么只需注入它(在构造函数中提供)并在测试中提供mock而不是实际实现。

答案 1 :(得分:0)

以下是使用JMockit 1.13模拟AuthenticationServicePort的示例测试:

public class AuthenticationModuleTest
{
    @Tested AuthenticationModule authentication;
    @Mocked AuthenticationServicePort authenticationService;
    @Mocked AuthenticationService port;

    @Test
    public void validateUser()
    {
        final String userName = "tester";
        final String password = "12345";
        authentication.setUserName(userName);
        authentication.setPassword(password);
        new Expectations() {{ port.login(userName, password); result = true; }};

        boolean validated = authentication.validateUser();

        assertTrue(validated);
    }
}